假設我有一個繼承自另一個類的類,並且我創建了一個從基類指向派生類對象的指針。現在,如果基類析構函數被定義爲虛擬的,那麼它不會產生任何問題。但是,在我的情況下,基類析構函數沒有聲明爲虛擬的,所以當我刪除這個指針時,它會導致內存泄漏。如何從基類中調用非虛擬的析構函數?
如何在不修改基類代碼的情況下克服這個問題?
假設我有一個繼承自另一個類的類,並且我創建了一個從基類指向派生類對象的指針。現在,如果基類析構函數被定義爲虛擬的,那麼它不會產生任何問題。但是,在我的情況下,基類析構函數沒有聲明爲虛擬的,所以當我刪除這個指針時,它會導致內存泄漏。如何從基類中調用非虛擬的析構函數?
如何在不修改基類代碼的情況下克服這個問題?
假設你的意思是你有Base*
類型的指針(不具有虛析構函數),指向Derived
類型的反對,並要刪除該。
處理這種情況的一種簡單方法是使用智能指針,例如std::shared_ptr
,它記住原始(靜態已知)對象類型並將其應用於刪除。
更一般地,不要使用明確的delete
:將其留給智能指針和容器對象。
您可以將基類強制轉換爲派生並調用delete。
顯示更多的代碼。特別是,顯示破壞數據的代碼(不清楚它是否是你的)。 –
你可以嘗試使用組合而不是繼承。 – soon