0

我很惊讶地看到,在VS2013附带的Visual C++版本中,新创建的类的数据成员似乎会根据它们的类型自动初始化为0null 。这是新的 - 非常有用!- 我的经验中的行为。我以前在编写严肃的应用程序时只使用过VC++ 版本 4,而早在 1990 年代中期,初始值就被明确声明为未定义/随机。

这可能是使用调试库的一些有用属性,还是可以一直依赖空初始化?

根据要求,一些示例代码 - 恐怕没什么令人兴奋的:

class CData
{
public:
    CData();
    CData(const CData &copy);
    ~Data();
    const CData& operator=(const CData &copy);
    //Accessors/Mutators follow...


private:
    bool Initialize_Data();
    //Just giving a couple of examples of data member sets.
    char *input_script_name;
    int size_input_script_name;
    int size_input_script_name_buffer;
    char *interpreter_name;
    int size_interpreter_name;
    int size_interpreter_name_buffer;
};

CData::CData()
{
    Initialize_Data();
}

CData::~CData()
{
    //Code to store relevent data in registry
    //and then free dynamically allocated memory follows...
}

bool CData::Initialize_Data()
{
    //Code to retrieve data from registry stored at end of last run follows
    //along with routines to check bounds.
    //
    //At this point, without executing any further a breakpoint is triggered
    //and on inspecting data members in a Watch on 'this' I find them
    //to be already initialized to either 0 or null respectively.

}

...

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    //Application entry point;

   CData application_data;  //and away it goes!

   //Usual name mutex to prevent multiple instances and message loop follow...
}

正如我所说的非常基本,我并没有说明所有代码。但是,在到达“Initialize_Data”中的断点时——即在创建类时立即执行任何其他操作之前——所有数据成员在 Watch 中显示为 0 或 null。这是相当令人惊讶的!

4

1 回答 1

0

这只是一个巧合。您可能会观察到,在您的对象初始化之前,某些东西会清除大量内存,然后您的对象会被放置在那个零初始化的内存中。不能保证这种情况会一直存在,您也不能在其他平台/编译器上依赖它。例如,在调试模式下,Visual C++ 实际上会尝试清除非零位模式。

如果要零初始化,可以使用 C++ 11 非静态成员初始化器,如下所示:

char *input_script_name = nullptr;
int size_input_script_name = 0;
int size_input_script_name_buffer = 0;
char *interpreter_name = nullptr;
int size_interpreter_name = 0;
int size_interpreter_name_buffer = 0;

如果一切都设置为 0,我不确定当前的编译器是否将其优化为 a memset,但如果您可以访问 C++11 编译器,这就是要走的路。

更新

刚刚检查了 Clang 3.4,如果一切都设置为 0,它确实会发出一个memset。GCC 使用寄存器初始化,但我怀疑这是因为我的小测试用例只有大约 10 个成员变量。

于 2014-08-08T09:03:15.787 回答