首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 對象指針數組離開作用域析構 0 次:指針數組不擁有對象生命周期

     編輯:程式設計疑難解答

代碼

class A { ~A() { cout << "dtor"; } };
void func() {
    A *p[5];   // 指針數組
    A a;       // 局部對象
    p[0] = &a;
    p[1] = new A;
    return;    // func 結束
}

為何 0 次?

  • p 是 **指針數組**(棧上 5 個指針變量),離開作用域時**僅釋放指針自身佔用的棧內存**,**不會**調用指向對象的析構函數。
  • a 是局部對象,**會**析構 1 次,但這與數組 p 無關(p[0] 只是恰好指向它)。
  • new A 分配在堆上,**不會**自動析構,需手動 delete p[1]。

核心規則

編譯器只負責析構「具有自動存儲期的對象」(即直接定義的局部變量)。指針、智能指針、容器本身是對象,但它們管理的「被指對象」不在自動析構範圍內,除非使用 RAII 封裝(如 unique_ptr、vector<A>)。

現代 C++ 寫法

std::vector> vec;
vec.emplace_back(std::make_unique());
// 離開作用域自動析構所有 A 對象

理解「指針數組 ≠ 對象數組」,避免資源洩漏與重複析構雙重風險。

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