首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 虛函數與虛析構函數 - 避免內存洩露的關鍵

     編輯:關於C++

問題現象

基類指針指向派生類對象,delete 時若基類析構函數非虛函數,只調用基類析構,派生類析構不被調用,導致派生類資源洩露。

代碼對比

非虛析構(錯誤)

class Base { public: ~Base() { cout << "Base destructor\n"; } };
class Derived : public Base { public: ~Derived() { cout << "Derived destructor\n"; } };
int main() { Base* p = new Derived(); delete p; } 
// 輸出:Base destructor  (Derived destructor 缺失)

虛析構(正確)

class Base { public: virtual ~Base() { cout << "Base destructor\n"; } };
// 輸出:Derived destructor -> Base destructor  (正確調用鏈)

最佳實踐

  • **凡是作為基類的類,析構函數必須聲明為 virtual**。
  • 若類不作為基類,可不加 virtual(微小性能優勢)。
  • C++11 起可用 final 禁止繼承,則無需虛析構。
  • 智能指針(unique_ptr/shared_ptr)刪除時也依賴虛析構正確調用。

虛函數表機制

虛析構使對象包含 vptr,delete 通過 vptr 查找正確析構函數入口。非虛析構則靜態綁定到基類析構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved