[英]Visual C++ seems to be zero-initializing POD members of a class which it shouldn't
我有这样的课:
class TestClass
{
public:
TestClass() {};
//Note: I wish not to initialize rawMemory (for whatever reason)
int rawMemory[32];
};
int main()
{
TestClass obj;
return 0;
}
在我使用TestClass obj;
创建一个TestClass
对象之后TestClass obj;
我得到了想要的行为:rawMemory未初始化(在调试模式下填充为0xcc,在释放模式下填充为不确定的随机值)。
如何将指针成员添加到类中:
class TestClass
{
public:
TestClass() {};
int rawMemory[32];
int* ptr;
};
rawMemory
初始化为零! 我认为按照标准,这是不应该发生的。 我什至尝试使用std::aligned_storage
专用于保留未初始化的自动内存,而rawMemory
仍然被零初始化!
class TestClass
{
public:
TestClass() {};
std::aligned_storage<sizeof(int), alignof(int)>::type rawMemory[32];
int* ptr;
};
注意:我尝试了g ++,它按预期工作。
更新:如果我将TestClass更改为一个结构,问题就解决了; 如果我给TestClass
一个默认的隐式构造函数,问题就解决了。
我终于找到了这个问题的根源。
当类中存在指针成员时,Visual C ++会在调用我定义的构造函数之前插入一个autoclassinit
方法调用。 此方法调用在某种程度上与成员初始化rawMemory
,并且对我的rawMemory
成员进行了零初始化 。
可以通过在Visual C ++编译器选项中禁用/sdl
来删除此行为。 但是,如果它不是非常关键的性能(或瓶颈),我的建议是保留它不变。
感谢所有尝试提供帮助的人!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.