class A { ~A() { cout << "dtor"; } };
void func() {
A *p[5]; // 指針數組
A a; // 局部對象
p[0] = &a;
p[1] = new A;
return; // func 結束
}
p 是 **指針數組**(棧上 5 個指針變量),離開作用域時**僅釋放指針自身佔用的棧內存**,**不會**調用指向對象的析構函數。a 是局部對象,**會**析構 1 次,但這與數組 p 無關(p[0] 只是恰好指向它)。new A 分配在堆上,**不會**自動析構,需手動 delete p[1]。編譯器只負責析構「具有自動存儲期的對象」(即直接定義的局部變量)。指針、智能指針、容器本身是對象,但它們管理的「被指對象」不在自動析構範圍內,除非使用 RAII 封裝(如 unique_ptr、vector<A>)。
std::vector> vec;
vec.emplace_back(std::make_unique());
// 離開作用域自動析構所有 A 對象
理解「指針數組 ≠ 對象數組」,避免資源洩漏與重複析構雙重風險。