【自我笔记之C语言】malloc 和new 有什么区别?new 和 new[]的区别?

一、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个字节用来存放对象数组的个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值