初始数据成员值

时间:2014-08-08 08:30:49

标签: c++ initialization data-members

我非常惊讶地发现,在 VS2013 附带的 Visual C ++ 版本中,新创建的类的数据成员似乎会自动初始化为 0 null 取决于其类型。这是新的 - 非常有用! - 我的经历中的行为。在编写严肃的应用程序时,我之前只使用过 VC ++ Version 4 ,而在1990年代中期,初始值明确地表示为未定义/随机。

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

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

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。这是相当令人惊讶的!

1 个答案:

答案 0 :(得分: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,我不确定当前编译器是否将其优化为memset,但如果您可以访问C ++ 11编译器,则可以采用这种方式。< / p>

更新

只需检查Clang 3.4,如果所有内容都设置为0,它会发出memset。GCC使用寄存器初始化,但我怀疑是因为我的小测试用例只有~10个成员变量。