在vc裡頭,用new建立乙個物件或者分配一塊記憶體的話,如果操作失敗並不會丟擲乙個異常,而只是返回乙個null指標。
有如下**:
delete p;
//p是乙個合法的指標
delete p;
這段**在vc的debug版本中會在執行第二行時給出警告,因為此時p指標指向的已不是乙個合法的被分配記憶體區了,delete 這樣乙個指標結果不可預料。還有,c++承諾 delete 乙個null指標是安全的。我跟蹤進vc的執行時庫里頭去看,delete操作當傳進的引數是null時就什麼也不做直接返回。
還有一段**:
lpvoid p;
p = heapalloc(
getprocessheap(),
heap_zero_memory,
10);
delete p;
這段**當執行到第三條語句時,也會發生不可預料的後果。因為,用api函式heapalloc分配的記憶體塊和用new操作符分配的記憶體塊的型別是不一樣的,記憶體管理系統登記的資訊也是不一樣的,所以記住:用heapalloc()分配的記憶體一定得用heapfree()釋放,而用new分配的記憶體一定得用delete來釋放,絕對不可以混合使用。
另外一段**:
char *p;
p = new char[10];
delete (p++);
這段**執行到第三行也會有問題,(p++)雖然指向的是合法的已分配記憶體位址,但是並不是這個記憶體塊的首位址,記憶體管理系統無法根據它來正確地釋放這個記憶體塊,結果也是不可預料的。
還有一種情況:
const char *p;
p = new char[10];
delete p;
這段**在編譯期會報錯。因為 delete 操作符的引數型別是void*,編譯器無法將const 指標轉化為非const指標,所以報錯。
又出現了問題了:(myclass是自己定義的類)
(1):
lpvoid p;
p = new myclass[10];
delete p;
(2):
lpvoid p;
p = new myclass[10];
delete p;
(3):
lpvoid p;
p = new myclass[10];
delete ((myclass*)p);
(4):
myclass *p;
p = new myclass[10];
delete p;
以上4段**在執行時都會出錯,output視窗會有memory check error出現。
(5):
myclass *p;
p = new myclass[10];
delete p;
(6):
lpvoid p;
p = new myclass[10];
delete ((myclass*)p);
以上兩段**執行正確。
(7):
lpvoid p;
p = new char[10];
delete p;
(8):
lpvoid p;
p = new char[10];
delete p;
以上兩段**執行也不會出現任何錯誤資訊。
結論就是,new了乙個物件陣列就一定要用 delete操作符釋放它們。因為new物件陣列比new乙個單獨的物件要儲存更多的資訊,所以分配的記憶體塊的組織結構也不一樣,而且delete需要正確的物件型別資訊,用void*指標做引數非常危險,必須將它顯式地轉化為正確型別的指標。而對於內建型別比如int,char等來說,就好象沒有以上的限制,不知道vc的編譯器是怎麼搗鼓的。
vector記憶體的分配與釋放
1.vector的記憶體增長 vector其中乙個特點 記憶體空間只會增長,不會減小,援引c primer 為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每乙個元素都緊挨著前乙個元素儲存。設想一下,當vector新增乙個元素時,為了滿足連續存放這個特性,都需要重新分配空間 拷貝元素 ...
記憶體動態分配與釋放
1 c語言的函式malloc和free 1 函式malloc和free在標頭檔案中的原型及引數 void malloc size t size 動態配置記憶體,大小有size決定,返回值成功時為任意型別指標,失敗時為null。void free void ptr 釋放動態申請的記憶體空間,呼叫fre...
記憶體動態分配與釋放
1 c語言的函式malloc和free 1 函式malloc和free在標頭檔案中的原型及引數 void malloc size t size 動態配置記憶體,大小有size決定,返回值成功時為任意型別指標,失敗時為null。void free void ptr 釋放動態申請的記憶體空間,呼叫fre...