在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释放则不会调用对象的析构方法。当然如果你是一个非对象类型,那可以。

在C++中,使用malloc申请的内存能否通过delete释放?使用new申请的内存...
不能,malloc \/free主要为了兼容C,new和delete 完全可以取代malloc \/free的。malloc \/free的操作对象都是必须明确大小的。而且不能用在动态类上。new 和delete会自动进行类型检查和大小,malloc\/free不能执行构造函数与析构函数,所以动态对象它是不行的。当然从理论上说使用malloc申请的内存是可以通过del...

用new申请的内存可以用free释放吗
不可以,new对应delete不可以张冠李戴。malloc\/free,new\/delete必需配对使用!malloc与free是c++、c语言的标准库函数,new、delete是c++的运算符。它们都可用用申请动态内存和释放内存。对于非内部数据类型的对象而言,光用malloc\/free无法满足动态对象的要求。对象在创建的同时要自动执行函数,对象在消亡之前要...

C++free释放问题
free释放内存的和delete可以说是两套代码,它们的逻辑不同,不能混用。用new申请的就要用delete翻译,用malloc申请的就要用free释放。顺便说一下它们还有一个区别, free 只是告诉操作系统回收内存,而delete会先调用类的析构函数,然后才告诉操作系统回收内存。

c++中有malloc必须有free么,为什么?
同样的道理,new开辟的空间也在堆区,你也必须用delete去释放。

c++中的线性表如何内存释放 清空
如果是用new 分配的,则用delete, 如果使用malloc分配的则用free,如下:struct Node { int value;Node * next;};Node *p = new Node();delete p; \/\/这儿使用delete释放p的内存 Node *q = (Node *) malloc(sizeof(struct Node));free(q);\/\/这儿使用free释放q的内存。

c++编程中,用new动态分配内存后,不使用delete,被分配的内存会永远丢失吗...
在C++中可以用new和malloc在堆上申请空间,并且必选相应地用delete和free进行释放空间,因为在C++编译器中,堆这部分存储空间是完全由程序员自己管理的,即由程序员自己分配和释放。如果在程序中用new和malloc申请了空间的话,但是在程序中没有手动用delete和free释放空间的话,在程序执行过程中以及程序执行...

C++. 首地址已知,元素类型已知(可以求大小),元素数量已知。问题:如何释 ...
如果你是用malloc开辟的内存空间就用free释放,如果你是用new开辟的内存空间就用delete释放,如果都不是,该内存的生存周期一过,自动释放~

C++中用new申请的空间能否用realloc来重新分配?如果可以,那么能否用del...
new除了申请空间还有执行构造函数作用,new出来如果是数组,用delete[]释放时会根据数组个数执行析构,所以new,delete和alloc类函数是不同的两套处理流程,不可能会通用。需要重分配只能用alloc。如果既需要重分配又要执行对象构造析构,参考下placement new。

C\/C++如果定义了一个char型指针并分配100的内存,全部memset为0,只给部 ...
可以,但请注意使用free或是delete。如果使用malloc分配,使用free,如果使用new 分配请使用delete。注意new和delete的使用:char *buffer = new char[100]; \/\/ 分配100字节 delete[] buffer; \/\/ 释放buffer指定的内存 buffer = NULL; \/\/ 防止buffer成为野指针 同时你需要了解内存分配的机制。简单来说...

C++中,new\/delete和malloc\/free的区别
1、new\/delete是C++的操作符,而malloc\/free是C中的函数。2、new做两件事,一是分配内存,二是调用类的构造函数;同样,delete会调用类的析构函数和释放内存。而malloc和free只是分配和释放内存。3、new建立的是一个对象,而malloc分配的是一块内存;new建立的对象可以用成员函数访问,不要直接访问它...

相似回答