malloc/free和new/delete

一、相同点

1. 都可以用来动态的分配和释放内存。

二、不同点

1. malloc/free是C的库函数,而new/delete是C++的操作符。

2. malloc不能用来动态创建对象。对象需要在创建的时候调用构造函数,在销毁的时候调用析构函数。但是因为malloc/free是库函数而非操作符,编译器对之无控制权。而new/delete可以用来动态的创建销毁对象。

3. 当分配内存出错时,malloc返回NULL,new则有两种处理方法:抛出bad_alloc异常,或者返回NULL(这是编译器相关的)。如果不处理此异常,系统则调用C++标准库中的terminate()函数,在默认情况下,terminate()将调用abort()终止程序。如果你不想new抛出异常,可以调用new的无异常版本:new(std::nothrow)。

4. malloc返回的值为void*,因而需要类型转换;而new返回的指针有类型信息。

三、注意

1. 如果使用free去释放由new创建的对象,会出问题,因为free无法调用析构函数,析构函数里作的工作将不再被做(编译链接没有问题)。如果用delete去释放由malloc创建的内存,没有问题,但可读性差。故而最好配套使用。

四、例子

class Base
{
public:
	Base(){cout<<"constructor";}
	~Base(){cout << "destructor";}
};

int main()
{
	cout << "pB1:\n";
	Base* pB1 = (Base*)malloc(sizeof(Base));
	delete pB1;
	cout << endl << "pB2:\n";
	Base* pB2 = new Base;
	free(pB2);
	system("pause");
	return 0;
}
输出为:


可见,用malloc时未调用构造函数,用free时未调用析构函数。

参考:

1. http://www.pixelstech.net/article/index.php?id=1340193129

2. http://blog.csdn.net/onlyonename/article/details/8655324

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值