malloc/free与new/delete的区别
在C中,用malloc函数开辟空间,用free函数释放空间,而在C++中,用new不仅可以开辟空间,还可以调用构造函数初始化,而delete则会先调的析构函数再释放空间,new和delete是操作符,而malloc和free是函数
New
malloc申请空间会返回值,若申请失败则返回NULL,realloc还会释放原有的空间,为了防止释放原因的空间,产生野指针,我们可以用下面代码预防
int* ptr = (int*)calloc(5,sizeof(int));
int* tmp = (int*)realloc(ptr, sizeof(int)*10);//realloc会释放原来的空间
if(tmp != NULL)//防止空间申请失败,又释放ptr
{
ptr = tmp;
}
但new不同的是当申请空间失败后会产生警报,我们可以用try...catch来实例化类或者使用set_new_handle()
new可以在申请空间的时候初始化,而malloc不行
int* ar = new ar[10]{1,2,3,4,5,6,7,8,9,10};
定位new是在已经分配的内存空间调用构造函数初始化对象
class Test
{
};
//重载定位new,可以选位置初始化
void* operator new(size_t sz, int* ar, int pos)
{
return ar[pos];
}
Test* t = new Test();
new(t)int(10);