STL 容器析構時會自動析構其**元素**,但若元素是**裸指針**,指針本身的析構函數不做任何事,**不會自動 delete 指向的對象**,導致內存洩露。
void leak() {
vector v;
for (int i=0; i<10; i++) v.push_back(new Widget);
} // v 析構,但 10 個 Widget 內存洩露
void manual() {
vector v;
// ... fill v
for (auto p : v) delete p;
}
缺點:非異常安全(異常拋出時洩露),代碼冗長。
struct DeletePtr { template void operator()(T* p) const { delete p; } };
void withForEach() {
vector v;
// ...
for_each(v.begin(), v.end(), DeletePtr());
}
仍非異常安全(填充與刪除之間異常)。
#include#include void modern() { vector > v; for (int i=0; i<10; i++) v.push_back(make_shared ()); } // 自動釋放,異常安全
優點:RAII,異常安全,無需手動管理。
auto_ptr 複製語義轉移所有權,放入容器會導致所有權混亂,**嚴禁使用**。