關於記憶體分配與釋放的試驗

2021-03-31 08:56:31 字數 1870 閱讀 3483

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