對同一類進行兩次析構的問題

2021-06-25 18:21:55 字數 1039 閱讀 4884

對於同乙個類進行兩次析構一般情況不會出現問題,但是當在析構函式中呼叫了delete對於類中的成員變數進行銷毀則會出現問題,如果進行兩次析構函式,則會對同乙個變數進行兩次銷毀,則第二次銷毀就會出現問題,會出現_block_type_is_valid(phead->nblockuse的問題。

出現這個問題的原因有:

1.記憶體洩漏:所以當程式退出是,系統會收回分配的記憶體,於是調析構函式,由於記憶體已被錯誤地釋放,於是就會出現「debug assertion failed」的錯誤。

2.這個assert說明什麼問題,說明有一塊內存在被釋放的時候,它的頭部裡面的資訊已經被改掉了,和預期的不一樣,記憶體分配的程式往往在被分配出的記憶體塊頭部放上一些校驗資訊,這個資訊記憶體的使用者是不知道也不應該修改的。這樣,在記憶體被釋放的時候,記憶體分配程式就可以校驗出這個頭部資訊是否被改過了,若被改過,就說明發生了記憶體的corruption。

這種corruption有兩種可能:

1.說明有人在記憶體越界寫東西;

2.這塊記憶體已經被釋放了,又被重複釋放了一次。

3.phead->nblockuse已經是空指標了。或者它指向的東西已經消失了。

下列是乙個例子:

class a

~a()

private:

int *use;

};class b

~b()

{}private:

a a;

};int main()

這個例子會發生錯誤,因為在b進行析構的時候會對成員a進行析構,會銷毀a的變數use,之後會再對a進行一次析構,這樣同乙個類物件a就進行了兩次析構,要消除這種錯誤,只有對b的成員變數a定義為a的引用,如下面的例子所所示。

class a

~a()

private:

int *use;

};class b

~b()

{}private:

a& a;

};

Python同一類中的方法呼叫問題

classa defa add b self a 10 b 20 self.s a b self.s1 a b return self.s,self.s1 defc add ab self c 30 s c self.s s2 c self.s1 print s print s2 t a t.a a...

labelme對同一型別的多個目標的識別問題

在使用labelme標記完影象後,我們可以使用labelme自帶的一套轉換工具 labelme json to dataset.exe 將每個對應的json檔案轉化為乙個字尾為 json的資料夾。資料夾內容如下 其中最重要的是名為label.png的16位,包含了具體哪乙個畫素作為mask的重要資訊...

兩次訪問同一靜態URL得到的檔案長度不一樣

在使用chrome瀏覽器請求乙個 伺服器上的url時,例如 第二個請求 仔細觀察請求頭部和應答頭部,兩次請求的user agent都一樣,應答的last modified都一樣,區別只在於後乙個請求使用了range方法,如下 第一次請求 直接請求 應答content length 9882602 第...