一、malloc 和new 有什么区别?
相同点:它们都是动态管理内存的入口。
不同点:
1、new是个关键字,malloc是函数
2、malloc在堆上开辟,new是自由存储区
3、new/delete(属于C++中的操作符)除了分配空间还会调用构造函数和析构函数进行初始化与清理,malloc/free(属于C/C++标准库的函数)只是动态分配内存空间/释放空间
4、new可以重载,malloc不行
5、new可以调用malloc,malloc不可以。new可以自己写operator、construt,这样就能调用,但是malloc不能自己写;另一方面C出现在C++之前,版本都是向前兼容的
6、malloc不会抛异常,而new会;无法重定义malloc失败时的默认行为(返回NULL),但是我们可以重定义new失败时默认行为,比如不让其抛出异常。
7、new可以开辟常量内存,malloc不可以 //const int *p = new const int(20);
8、malloc/free需要手动计算类型大小且返回值会void*而。new/delete可自己计算类型的大小,返回对应类型的指针;
9、内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是哪个文件的哪一行,而malloc没有这些信息。
10、new的效率malloc稍微低一些,new可以认为是malloc加构造函数的执行。
二、new 和 new[]的区别?
new 用于单个对象或者实例的创建,就是调用类的构造函数
new[]用于创建对象或实例的数组实例,并且地址是连续的
释放内存时,new使用 delete,而new[]则对应delete[]
对于内置类型,可以用new[]开辟, delete释放
int* p = new int[10];//operator new[](size_t size); //0x100 40//一次性开辟
delete p;//0x100
但是对于对象类型,不可以,只能是new[], delete[]释放
class Test
{
public:
Test(int a=10) :ma(a)
{
std::cout << "Test::Test(int)" << std::endl;
}
~Test()
{
std::cout << "Test::~Test()" << std::endl;
}
private:
int ma;
};
Test* ptest = new Test[10];
delete[] ptest;//大小是44,因为剩下的4个字节用来存放对象数组的个数