new和malloc区别,delete和delete []区别

时间:2023-03-09 00:16:52
new和malloc区别,delete和delete []区别

面试被问到上述问题,所以特地总结一下:

一、new和malloc的区别。

1.new可以返回指定类型的指针,并且自动分配内存大小;malloc需要计算手动计算分配空间的大小,并且返回值需要强转为实际类型的指针。

2.malloc只会进行内存分配,不会进行初始化,所以其值是随机的;new在内存分配的同时会进行初始化。

3.malloc分配失败会返回空指针NULL;new分配失败会抛出std::bad_alloc异常

这里插入一个例子(还没太明白,先mark在这里)

#include<iostream>
using namespace std; void* operator new(std::size_t) throw (std::bad_alloc)
{
throw bad_alloc();
} void operator delete(void* p) throw()
{
} class widget
{
public:
widget()
{
cout << "widget()" <<endl;
}
}; int main()
{
try
{
widget *pw1 = new widget;// 分配失败抛出std::bad_alloc
if(pw1 == ) // 这个检查一定失败
{
cout << "pw1" <<endl;
}
}
catch(...)
{
cout << "throw "<< endl;
} try
{
widget *pw2 = new (nothrow) widget; // 若分配失败返回0
if(pw2 == ) // 这个检查可能会成功
{
cout << "pw2" <<endl;
}
}
catch(...)
{
cout << "throw "<< endl;
} return ;
}

4.有了malloc/free为什么还要new/delete?

简而言之:malloc/free是库函数,new/delete是C++的运算符。malloc/free不能执行构造函数和析构函数,在动态分配内存的时候也不能进行初始化,不能完成对象的内存管理。

5.有了new/delete为什么还要malloc/free?

因为C++经常调用C函数,而C程序只能用malloc/free管理动态内存。

(参考:http://www.cnblogs.com/fly1988happy/archive/2012/04/26/2470542.html)

二、delete和delete []区别

delete 释放new分配的单个对象指针指向的内存
delete[] 释放new分配的对象数组指针指向的内存

1.对于简单类型来说

int *a = new int[10];
   delete a;
   delete [] a;

两者效果相同。

2.对于自定义的对象来说

A *a = new A[10];

delete a;

delete []a;

delete a只会调用a[0]的析构函数,a[1]-a[9]分配的空间不会被释放。

delete []a;会调用a[0]-a[9]的析构函数,释放a指针指向的全部内存空间,会逐一调用对象的析构函数。

(参考:https://www.cnblogs.com/wangjian8888/p/7905176.html)

三、使用new[]/delete[]时的内存分布情况

对非内置对象new[]时会多分配4个字节,因为需要存放析构时的对象个数,对于内置类型则不需要这个4个字节。

(参考https://blog.csdn.net/qq_33573235/article/details/79485266,讲的非常详细了)