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

Effective STL 第 7 條:容器中 new 的指針必須手動 delete

     編輯:關於C++

核心觀點

STL 容器析構時會自動析構其**元素**,但若元素是**裸指針**,指針本身的析構函數不做任何事,**不會自動 delete 指向的對象**,導致內存洩露。

錯誤示例

void leak() {
    vector v;
    for (int i=0; i<10; i++) v.push_back(new Widget);
} // v 析構,但 10 個 Widget 內存洩露

修正方案一:手動遍歷 delete

void manual() {
    vector v;
    // ... fill v
    for (auto p : v) delete p;
}

缺點:非異常安全(異常拋出時洩露),代碼冗長。

修正方案二:仿函數 + for_each(C++98 風格)

struct DeletePtr { template void operator()(T* p) const { delete p; } };
void withForEach() {
    vector v;
    // ...
    for_each(v.begin(), v.end(), DeletePtr());
}

仍非異常安全(填充與刪除之間異常)。

最佳方案:智能指針(shared_ptr / unique_ptr)

#include 
#include 
void modern() {
    vector> v;
    for (int i=0; i<10; i++) v.push_back(make_shared());
} // 自動釋放,異常安全

優點:RAII,異常安全,無需手動管理。

禁忌:auto_ptr 容器

auto_ptr 複製語義轉移所有權,放入容器會導致所有權混亂,**嚴禁使用**。

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