每日分享一個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[] 就會自動執行,內存安全回收。
注意事項
-
配對使用
new→deletenew[]→delete[]
混用會導致未定義行為。
- 默認析構函數是空的
編譯器會自動生成一個析構函數,但如果類中涉及動態資源管理,這個默認的沒用。 - 不需要就不用寫
如果類裏全是普通變量(如 int、string),不需要手動管理內存,可以不寫析構函數。
std::string內部自己處理了內存,所以安全。 -
不要重複釋放
~Person() { delete[] name; delete[] name; // 錯誤!同一塊內存釋放兩次 }
總結
- 析構函數用於清理資源
- 用
new分配內存 → 必須寫析構函數 - 記住:誰申請,誰釋放
- 合理使用,才能寫出穩定、安全的C++程序
每天一點C++,積少成多。
我們明天見。
本文由mdnice多平台發佈