在C++中,使用malloc申请的内存能否通过delete释放?使用new申请的内存能否用free?
3个回答
2013-08-21
展开全部
不能,malloc /free主要为了兼容C,new和delete 完全可以取代malloc /free的。malloc /free的操作对象都是必须明确大小的。而且不能用在动态类上。new 和delete会自动进行类型检查和大小,malloc/free不能执行构造函数与析构函数,所以动态对象它是不行的。当然从理论上说使用malloc申请的内存是可以通过delete释放的。不过一般不这样写的。而且也不能保证每个C++的运行时都能正常。
展开全部
从编程纪律、规则上说,是不可以。
因为 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;
}
错配会导致严重的问题,比如内存泄漏等。
因此工作中不提倡这种错配写法,尽管有时可能不会导致程序出错,但是这是一种很坏的习惯。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
当然可以了。delete只是c++的一个全局重载操作符。他只是在free前调用对象的析构方法。
但是new申请的内存用free释放则不会调用对象的析构方法。当然如果你是一个非对象类型,那可以。
但是new申请的内存用free释放则不会调用对象的析构方法。当然如果你是一个非对象类型,那可以。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询