我想知道在heap上用new创建的对象中的内置类型是否会被初始化为零?它是标准规定的,还是特定于编译器的?
给定以下代码:
#include <iostream>
using namespace std;
struct test
{
int _tab[1024];
};
int main()
{
test *p(new test);
for (int i = 0; i < 1024; i++)
{
cout << p->_tab[i] << endl;
}
delete p;
return 0;
}运行时,它打印全零。
发布于 2012-02-04 23:37:40
不,如果你这样做:
int *p = new int;或
char *p = new char[20]; // array of 20 bytes或
struct Point { int x; int y; };
Point *p = new Point;则p指向的内存将具有不确定/未初始化的值。
但是,如果您这样做:
std::string *pstring = new std::string();然后,您可以确信字符串将被初始化为空字符串,但这是因为类构造函数的工作方式,而不是因为有关堆分配的任何保证。
发布于 2012-02-05 00:11:38
您可以选择是默认初始化(保留基础类型(和一般的POD类型)未初始化)还是值初始化(零初始化基础(和POD)类型)。
int * garbage = new int[10]; // No initialisation
int * zero = new int[10](); // Initialised to zero.这是由标准定义的。
发布于 2012-02-04 23:37:41
这不是标准所要求的。基元类型成员的内存可以包含最后留在内存中的任何值。
我猜有些编译器可能会选择初始化字节。许多都是在代码的调试版本中这样做的。它们分配一些已知的字节序列,在调试时给你一个提示,内存不是由你的程序代码初始化的。
https://stackoverflow.com/questions/9141970
复制相似问题