在c++++中,new用于動(dòng)態(tài)分配內(nèi)存并調(diào)用構(gòu)造函數(shù),delete用于釋放內(nèi)存并調(diào)用析構(gòu)函數(shù)。1. new分配單個(gè)對(duì)象或數(shù)組,如int p = new int或int arr = new int[10]。2. delete用于釋放單個(gè)對(duì)象,delete[]用于釋放數(shù)組。3. 常見(jiàn)錯(cuò)誤包括用delete釋放數(shù)組、重復(fù)釋放指針或忘記釋放導(dǎo)致內(nèi)存泄漏。4. new/delete與malloc/free的區(qū)別在于類型安全、構(gòu)造/析構(gòu)調(diào)用及返回值類型。5. 推薦使用智能指針自動(dòng)管理內(nèi)存,避免手動(dòng)操作帶來(lái)的問(wèn)題。
在c++中,new和delete是用于動(dòng)態(tài)內(nèi)存管理的一對(duì)操作符。簡(jiǎn)單來(lái)說(shuō),new用來(lái)申請(qǐng)堆內(nèi)存,delete用來(lái)釋放之前用new申請(qǐng)的內(nèi)存。如果只分配不釋放,就會(huì)造成內(nèi)存泄漏;如果錯(cuò)誤使用,還可能引發(fā)程序崩潰。
new的基本用法
new的作用是動(dòng)態(tài)分配內(nèi)存,并返回指向該內(nèi)存的指針。它會(huì)調(diào)用構(gòu)造函數(shù)初始化對(duì)象。
基本語(yǔ)法:
立即學(xué)習(xí)“C++免費(fèi)學(xué)習(xí)筆記(深入)”;
int* p = new int; // 分配一個(gè)int大小的空間 int* arr = new int[10]; // 分配一個(gè)包含10個(gè)int的數(shù)組
注意點(diǎn):
-
使用完后必須手動(dòng)調(diào)用delete或delete[]來(lái)釋放,否則內(nèi)存不會(huì)自動(dòng)回收。
-
如果分配失敗,默認(rèn)情況下會(huì)拋出std::bad_alloc異常(除非使用nothrow版本):
int* p = new (std::nothrow) int; // 分配失敗時(shí)返回 nullptr
delete的基本用法
delete用于釋放由new分配的單個(gè)對(duì)象,而delete[]則用于釋放由new[]分配的數(shù)組。
基本語(yǔ)法:
立即學(xué)習(xí)“C++免費(fèi)學(xué)習(xí)筆記(深入)”;
delete p; // 釋放單個(gè)對(duì)象 delete[] arr; // 釋放數(shù)組
常見(jiàn)錯(cuò)誤:
- 用delete釋放數(shù)組,會(huì)導(dǎo)致未定義行為。
- 多次釋放同一個(gè)指針(重復(fù)釋放)也會(huì)導(dǎo)致崩潰。
- 忘記釋放,造成內(nèi)存泄漏。
new/delete與malloc/free的區(qū)別
雖然兩者都能分配和釋放內(nèi)存,但有幾個(gè)關(guān)鍵區(qū)別:
-
類型安全:
- new會(huì)根據(jù)類型自動(dòng)計(jì)算所需內(nèi)存大小,不需要手動(dòng)指定字節(jié)數(shù)。
- malloc需要顯式傳入字節(jié)數(shù),容易出錯(cuò)。
-
構(gòu)造與析構(gòu):
- new會(huì)調(diào)用構(gòu)造函數(shù),delete會(huì)調(diào)用析構(gòu)函數(shù)。
- malloc和free只是分配原始內(nèi)存,不會(huì)觸發(fā)構(gòu)造/析構(gòu)。
-
返回值類型:
- new返回的是具體類型的指針,無(wú)需強(qiáng)制轉(zhuǎn)換。
- malloc返回的是void*,需要手動(dòng)轉(zhuǎn)換為對(duì)應(yīng)類型。
舉個(gè)例子:
class MyClass { public: MyClass() { cout << "Constructor called!" << endl; } ~MyClass() { cout << "Destructor called!" << endl; } }; MyClass* obj = new MyClass; // 構(gòu)造函數(shù)被調(diào)用 delete obj; // 析構(gòu)函數(shù)被調(diào)用
而用malloc的話:
MyClass* obj = (MyClass*)malloc(sizeof(MyClass)); // 不會(huì)調(diào)用構(gòu)造函數(shù)!
實(shí)際使用建議
- 盡量使用智能指針(如std::unique_ptr、std::shared_ptr),它們能自動(dòng)管理內(nèi)存生命周期,避免手動(dòng)使用new/delete帶來(lái)的風(fēng)險(xiǎn)。
- 如果必須手動(dòng)管理:
- 配套使用new和delete,數(shù)組用new[]和delete[]。
- 分配后檢查是否為nullptr(尤其在使用nothrow時(shí))。
- 使用完畢及時(shí)釋放,避免內(nèi)存泄漏。
- 不要對(duì)同一個(gè)指針多次調(diào)用delete。
基本上就這些了。理解清楚再動(dòng)手寫(xiě)代碼,不容易出錯(cuò)。