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

C++ 賦值運算符重載陷阱:返回 new 對象導致內存洩漏

     編輯:程式設計綜合問答

錯誤代碼

Foo& Foo::operator=(const Foo& f) {
    return *new Foo(f); // 每次賦值 new 一個對象,無人 delete
}

後果

  • 舊對象內存未釋放。
  • 返回的臨時對象無所有權,調用方無法釋放。
  • 連續賦值 a = b = c 會洩漏多塊內存。

正確寫法:Copy-and-Swap

Foo& Foo::operator=(Foo other) { // 參數按值傳遞,觸發拷貝構造
    swap(*this, other);        // 交換內部資源
    return *this;              // other 析構時釋放舊資源
}

void swap(Foo& a, Foo& b) noexcept {
    using std::swap;
    swap(a.ptr_, b.ptr_); // 假設內部有裸指針或資源句柄
}

C++11 移動語義版

Foo& operator=(Foo&& other) noexcept {
    if (this != &other) {
        delete ptr_;
        ptr_ = other.ptr_;
        other.ptr_ = nullptr;
    }
    return *this;
}

總結

賦值運算符必須**釋放舊資源、接管新資源、返回 \*this**,絕不返回 new 對象。

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