在C++中,使用malloc申请的内存能否通过delete释放?使用new申请的内存能否用free?

如题所述

不能,malloc /free主要为了兼容C,new和delete 完全可以取代malloc /free的。malloc /free的操作对象都是必须明确大小的。而且不能用在动态类上。new 和delete会自动进行类型检查和大小,malloc/free不能执行构造函数与析构函数,所以动态对象它是不行的。当然从理论上说使用malloc申请的内存是可以通过delete释放的。不过一般不这样写的。而且也不能保证每个C++的运行时都能正常。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-06-27

从编程纪律、规则上说,是不可以。

因为 new 和delete 操作时, 是把对象当成一个复杂类,而执行对应的构造/析构函数。  而 malloc 和 free 则不执行它们。

题目中所说的两种错配情况, 会导致不可预测的错误发生。而这种错误,在项目很大时是比较难发现的。相当于项目中埋藏的炸弹。

但是当对象是简单类型时,确实是不会出错。比如

int *i=new int[100];
free(i);

原因是 int,float 这种数字类型过于简单,没有复杂的构造/析构函数,因此此时 new 和 malloc是等价的。

但是比如在复杂类型A中:

class A
{
void * t;
public A(){
t=malloc(100);
}
public ~A() {
free(t);
}
};

void main() {
A *m=new A();
A *n=(A *)malloc(sizeof(A));//导致n的构造 没运行
free(m);        //导致m的析构没运行.
delete n;        



}

错配会导致严重的问题,比如内存泄漏等。

因此工作中不提倡这种错配写法,尽管有时可能不会导致程序出错,但是这是一种很坏的习惯。

第2个回答  2017-06-16
当然可以了。delete只是c++的一个全局重载操作符。他只是在free前调用对象的析构方法。
但是new申请的内存用free释放则不会调用对象的析构方法。当然如果你是一个非对象类型,那可以。
相似回答