博客 / 詳情

返回

每日分享一個C++知識點☞析構函數

每日分享一個C++知識點☞析構函數

在C++中,對象有生命週期:
創建時調用構造函數,銷燬前調用析構函數。

很多人重視構造,卻忽略析構。
結果就是:內存泄漏、資源未釋放、程序越跑越慢。

今天就把析構函數説清楚。


什麼是析構函數?

它是類的一個特殊成員函數,作用是:
👉 在對象被銷燬前,自動執行清理工作

比如釋放 new 出來的內存、關閉文件、斷開連接等。


基本規則

  • 函數名:類名前加 ~,如 ~Person()
  • 沒有返回值(連 void 都不用寫)
  • 不能有參數
  • 不能被手動調用(一般情況下)
  • 一個類只有一個析構函數

為什麼要寫?

看這個例子:

class Person {
    char* name;
public:
    Person(const char* n) {
        name = new char[100];
        strcpy(name, n);
    }
};

構造函數裏用了 new,但沒有寫析構函數。
當對象銷燬時,name 指向的內存不會自動釋放。

結果:內存泄漏。

解決辦法:加上析構函數。

~Person() {
    delete[] name;
}

完整代碼:

class Person {
    char* name;

public:
    Person(const char* n) {
        name = new char[100];
        strcpy(name, n);
    }

    ~Person() {
        delete[] name;
    }
};

現在,只要對象生命週期結束,delete[] 就會自動執行,內存安全回收。


注意事項

  1. 配對使用

    • newdelete
    • new[]delete[]
      混用會導致未定義行為。
  2. 默認析構函數是空的
    編譯器會自動生成一個析構函數,但如果類中涉及動態資源管理,這個默認的沒用。
  3. 不需要就不用寫
    如果類裏全是普通變量(如 int、string),不需要手動管理內存,可以不寫析構函數。
    std::string 內部自己處理了內存,所以安全。
  4. 不要重複釋放

    ~Person() {
        delete[] name;
        delete[] name; // 錯誤!同一塊內存釋放兩次
    }

總結

  • 析構函數用於清理資源
  • new 分配內存 → 必須寫析構函數
  • 記住:誰申請,誰釋放
  • 合理使用,才能寫出穩定、安全的C++程序

每天一點C++,積少成多。
我們明天見。

本文由mdnice多平台發佈

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.