使用new時的初始化問題

2021-07-03 16:39:07 字數 2444 閱讀 7320

在使用new分配記憶體單元時,一般希望新分配的單元能被初始化為全0。注意以下兩條語句:

c++ code 

1

2

int*ptrint1 

= newint; 

//新分配的記憶體單元裡的值是未知

int*ptrint2 

= newint(); 

//加上括號。新分配的記憶體單元裡的值是全0

例1:在區域性區域

c++ code 

1

2

3

4

5

void

main()

例2:在區域性區域內,初始化為指定值

c++ code 

1

2

3

4

5

void

main()

在win32中,位址是乙個無符號的雙字,所以int* 型別的變數是乙個雙字大小的容器,裡面用來裝其所指向的記憶體單元的位址。從上圖可以看出ptrint1的值為003a4d08h,表示在用new int分配記憶體單元時,這個新的記憶體單元(其大小為乙個雙字,win32中int型別的單元要佔32bit)的位址為003a4d08h。而由位址003a4d08h所指向的這個新分配的雙字單元,裡面的值為無意義的cdcdcdcdh。

對於int *ptrint2 = new int(0x12345678); ptrint2的值為003a4d48h,且由位址003a4d48h所指向的這個新分配的雙字單元,裡面的值被初始化為12345678h。

例3:在區域性區域內,分配陣列

c++ code 

1

2

3

4

5

void

main()

例4:在全域性區域內的情況跟在區域性區域的以上情況都一樣。(這跟普通的變數有區別)

c++ code 

1

2

3

4

5

6

7

int*ptrint1 

= newint[

5]; 

//記憶體單元裡的值未知

int*ptrint2 

= newint[

5](); 

//記憶體單元裡的值均為0

void

main()

例5:如果是普通變數,那麼在區域性區域內的預設初始值是未知,而在全域性區域內的的預設初始值是全0。

c++ code 

1

2

3

4

5

6

7

8

intvar1[

5]; 

//5個單元的值為全0

void

main()

//通過這種方式可將單元裡的值初始化為全0,

//等價於int var3[5]=

} //

/關於c++的new是否會對記憶體初始化的問題 - 秋蒼庸的專欄 - 部落格頻道 - csdn.net

先把結論放上來:

c++在new時的初始化的規律可能為:對於有建構函式的類,不論有沒有括號,都用建構函式進行初始化;如果沒有建構函式,則不加括號的new只分配記憶體空間,不進行記憶體的初始化,而加了括號的new會在分配記憶體的同時初始化為0。

以下**:

#include

using namespace std;

int main()

delete a;

int *b=new int[1000];

for(int i=0;i<100;i++)

delete a;

int *b=new int[1000]();

for(int i=0;i<100;i++);

};main函式中使用語句:

a *b=new a;

cout但是,如果吧a的建構函式刪掉,則兩個語句輸出的結果分別是:隨機數,0。

由此可見,c++在new時的初始化的規律可能為:對於有建構函式的類,不論有沒有括號,都用建構函式進行初始化;如果沒有建構函式,則不加括號的new只分配記憶體空間,不進行記憶體的初始化,而加了括號的new會在分配記憶體的同時初始化為0。

new的初始化

有如下c int buffer new int 512 在預設情況下,new是不會對分配的int進行初始化的。要想使分配的int初始化為0,需要顯式地呼叫其初始化函式 int buffer new int 分配的乙個int初始化為0 int buffer new int 0 分配的乙個int初始化為...

值初始化 new

程式如下 include using namespace std int main int a new int 1 int b new int 2 int c new int 3 cout int p new int 5 這句是從堆上分配乙個int型變數所佔的位元組記憶體,這個記憶體單元存放的整數值...

關於New字元陣列時初始化現象

在用new分配空間時要特別注意初始化現象。也許會因為初始化而使得記憶體不能用。例如下面 的操作就會出現異常。char str str new char 5 abc str 1 a 出現異常 delete str 出現異常 輪不到這個異常 經過測試 str 0 a 也會出現異常 所以我猜測 str n...