2012-02-04 105 views
0

我想知道在堆中创建的对象中的内置类型是否会初始化为零?它是由标准强制还是编译器特定?C++堆对象的初始化

考虑下面的代码:

#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; 
} 

运行时,它打印全部为零。

+0

请参阅Johannes答案http://stackoverflow.com/questions/808464/c-new-call-that-behaves-like-calloc – 2012-02-04 15:37:51

回答

2

不,如果你做这样的事情:

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(); 

然后,你可以放心,该字符串将被初始化为空字符串,但就是因为没有因为类构造函数是如何工作的,有关堆分配的任何保证。

+0

仅仅因为它是空的,并不意味着它已被初始化为0. – 2012-02-04 15:38:52

+2

但是int * n new int [20]();定义最后的括号将内存初始化为零。请参阅:http://stackoverflow.com/questions/2204176/how-to-initialise-memory-with-new-operator-in-c – 2012-02-04 15:39:25

0

这不是标准的要求。原始类型成员的内存可能包含最后留在内存中的任何值。

一些编译器我想可以选择初始化字节。许多代码都是在调试版本中完成的。他们分配一些已知的字节序列,在调试内存时没有被程序代码初始化时给你一个提示。

-1

使用释放calloc将返回初始化为0字节,但是这不是标准的特定的。 calloc和C一起以及malloc。但是,您将为使用calloc支付运行时间开销。

有关使用STD前面给出的建议:: string是相当明显的,因为毕竟,您使用的性病,并获得的班级建设/破坏行为的好处。换句话说,你不必担心,比如初始化数据,可能出错的就越少。

11

您可以选择您是否希望未初始化默认初始化,这让基本类型(和POD类型一般),或值初始化,其中零初始化根本(和POD)类型。

int * garbage = new int[10]; // No initialisation 
int * zero = new int[10](); // Initialised to zero. 

这是由标准定义的。

+1

对于非基本类型,还需要注意的是,默认初始化和值 - 初始化(不带参数)调用默认构造函数。 – 2012-02-04 21:48:24