我非常惊讶地发现,在 VS2013 附带的 Visual C ++ 版本中,新创建的类的数据成员似乎会自动初始化为 0 或 null 取决于其类型。这是新的 - 非常有用! - 我的经历中的行为。在编写严肃的应用程序时,我之前只使用过 VC ++ Version 4 ,而在1990年代中期,初始值明确地表示为未定义/随机。
这可能是使用调试库的一些有用属性,还是可以一直依赖于null初始化?
根据要求,一些示例代码 - 恐怕没什么特别令人兴奋的:
class CData
{
public:
CData();
CData(const CData ©);
~Data();
const CData& operator=(const CData ©);
//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。这是相当令人惊讶的!
答案 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个成员变量。