C++中new/malloc/free/delete的區(qū)別

C++中new/malloc/free/delete的區(qū)別

共同點(diǎn)

  • 1 均是用于分配內(nèi)存的工具, 且分配和釋放均是一一對(duì)應(yīng)的否則就會(huì)出現(xiàn)內(nèi)存泄漏
  • 2 都是從堆中分配內(nèi)存

區(qū)別

  • 1 使用方式的區(qū)別: 前兩個(gè)是運(yùn)算符后兩個(gè)是函數(shù); new會(huì)根據(jù)類型自動(dòng)推斷大小, malloc必須指定大小.
int main()
{
    int *a = new int;
    int *b = (int*)malloc(sizeof(int));
    delete a;
    free(b);
}
  • 2 返回值不同, malloc為了通用返回的是void*類型指針, 而new返回指定的類型指針.

  • 3 失敗告警不同, malloc失敗返回NULL, 但是new僅拋出bad_alloc異常

#include <iostream>     // std::cout
#include <new>          // std::bad_alloc
 
int main()
{
    char *p;
    try
    {
        do
        {
            p = new char[2047 * 1024 * 1024];         //每次1M
        } while (p);
    }
    catch(std::exception &e)
    {
        std::cout << e.what() << endl;
    };
 
    return 0;
}

//結(jié)果
std::bad_alloc

  • 4 new/delete是C++獨(dú)有的, 而malloc/free兼容C

new返回NULL指針

#include <iostream>     // std::cout
#include <new>          // std::bad_alloc
 
int main()
{
    char *p = new (std::nothrow) char[2047 * 1024 * 1024];         //每次1M
    if(!p)
    {
        std::cout<<"alloc error"<<std::endl;
    }
 
    return 0;
}

使用std::nothrow

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容