2012-02-04 75 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