續杯版 new和deletee未配對使用的後果

2021-10-10 22:27:59 字數 741 閱讀 6826

問題:如果你使用了new分配記憶體,但是使用了delete來釋放它,會發生什麼事情?

答案:new將分配沒有隱藏計數器的單個物件,而delete將查詢它認為存在實際上卻不存在的隱藏計數器,因此程式將發生崩潰(因為訪問了不存在的記憶體)或獲取隨機數並嘗試破壞其他記憶體空間。

如果此隨機數大於1,則將在物件之後開始破壞記憶體。

如果隨機數為零,則不會破壞任何內容。

如果隨機數恰好是1,則將破壞乙個物件的記憶體。

接下來,delete將嘗試釋放實際儲存塊前面乙個size_t處的儲存塊。根據堆記憶體釋放的原理,此引數可能會被檢測為無效引數並被忽略,否則可能導致堆記憶體被破壞。

所以,結論是:這樣做的結果不會太好。

問題:如果我使用new來分配記憶體,而使用delete來釋放,又會如何?

答案:new將會分配多個物件,並將物件數目儲存在隱藏的計數器中。delete破壞向量中的第乙個物件。如果它是零個物件的向量,則會導致記憶體損壞。

如果它是兩個或更多物件的向量,則不會破壞物件2或者其他物件。結果是:記憶體洩漏。

接下來,delete將直接釋放儲存塊,這將失敗,因為儲存塊實際上是從向量前面的隱藏size_t開始的。由於釋放的記憶體不是有效的堆指標,因此這再次破壞了堆記憶體。

結論:這同樣不是乙個好做法。

問題:如果從類定義中刪除析構函式myclass::~myclass(),可以執行哪些優化?

答案ÿ

深入new和delete小結

new和delete是c 中使用頻率非常高的兩個關鍵字,可以說c 記憶體操作的核心就在於這兩個關鍵字,近幾天閱讀了相關的文章,發現自己對於這兩個關鍵字的理解太過膚淺,因此做了一些個人總結。首先要明確一點,new和delete所操作的記憶體全部是在堆區,這個區域的記憶體和棧區是不一樣的,不會自動釋放,...

New和delete的原理

new和delete的原理 當我們在程式中寫下 new 和 delete 時,我們實際上呼叫的是 c 語言內建的 new operator 和 delete operator.所謂語言內建就是說我們不能更改其含義,它的功能總是一致的。以 new operator 為例,它總是先分配足夠的記憶體,而後...

多型與new和delete

在使用多型時,在new和delete時一定要保持原有物件型別,不能在new時就進行強制轉換,否則會在析構時出現問題。其他時候可以使用 如下面的例子 class cbase cbase virtual void call class cinherit public cbase cinherit vir...