【发布时间】:2019-04-19 10:51:24
【问题描述】:
我有这样的课:
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 对象后,我得到了我想要的行为: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 一个默认的隐式构造函数,问题就消失了。
【问题讨论】:
-
编译器实现是否允许这样做。标准中没有任何规定禁止这样做。此外,为
rawMemory分配的内存可能已经包含零。 -
标准不要求初始化成员。这与要求将它们初始化为非零值不同。
-
@FawkesFlammer 为什么你会假设用零(或任何其他值)填充的内存已被初始化?
-
仅仅因为内存的内容恰好为零并不意味着编译器实际上生成了将内存初始化为零的代码……零是内存中最常见的元素之一……
-
但无论如何:您使用的是哪个版本的 Visual C++ 以及您使用哪些编译器标志进行编译?您确实意识到,出于安全原因,任何现代操作系统只会将您的进程归零内存页面吗?
标签: c++ visual-c++