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