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

C++ 結構體含指針成員 delete 前必須手動釋放指向內存:RAII 最佳實踐

     編輯:程式設計綜合問答

問題


struct Node {
    int *data; // 指向 new 分配的內存
};
Node *n = new Node;
n->data = new int[100];
// delete n; // 錯誤:n->data 內存洩漏

原因

delete n 僅釋放 Node 對象本身(含指針變量 data),不會自動釋放 data 指向的堆內存。必須先 delete[] n->data; 再 delete n;。

解決方案:RAII 封裝


struct Node {
    std::unique_ptr data; // 或 std::vector
    Node(size_t sz) : data(std::make_unique(sz)) {}
    // 無需手動釋放,析構函數自動調用 data.reset()
};
// 使用
auto n = std::make_unique(100);
// 離開作用域自動釋放所有內存

手動管理版(C 風格)


void destroy(Node *n) {
    delete[] n->data; // 先釋放成員指向內存
    n->data = nullptr;
    delete n;         // 再釋放結構體
}

最佳實踐

  • C++ 優先使用智能指針 (unique_ptr, shared_ptr) 或容器 (vector, string) 管理動態內存。
  • 若必須用裸指針,在結構體中提供 destroy 靜態方法或析構函數封裝釋放邏輯。
  • 代碼審查重點檢查「new/delete 配對」與「所有權轉移」。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved