C++的new和delete怎么用?有什么區(qū)別?

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怎么用?有什么區(qū)別?

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ò)。

以上就是C++的new和delete怎么用?有什么

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊8 分享