在使用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...