【发布时间】:2013-12-10 07:12:33
【问题描述】:
我遇到了一个我无法解决的问题。
我的问题是,如果我使用malloc 分配内存,然后使用delete 删除内存块?
一般的经验法则是
如果我们使用 malloc 分配内存,则应该使用 free 将其删除。
如果我们使用 new 分配内存,则应该使用 delete 将其删除。
现在,为了检查如果我们反过来会发生什么,我写了一个小代码。
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
class A
{
int p=10;
public:
int lol() {
return p;
}
};
int main()
{
int *a = (int *)malloc(sizeof(int)*5);
for(int i=0; i<4; i++) {
a[i] = i;
cout << a[i] << endl;
}
delete(a);
// Works fine till here..
A b;
cout << b.lol() << endl;
free(b); // Causes error.
return 0;
}
我得到的错误是:
错误:无法将参数“1”的“A”转换为“void*”到“void” 免费(无效*)'
我无法理解为什么会这样。请解释一下。
【问题讨论】:
-
b 的类型是 A 类。它不是指针。因此,您无法释放它。
-
首先,你实际上并没有使用
new来分配b。 -
您将对象传递给
free,而不是指针... -
如果你更正了代码,那将是未定义的行为试图在
new分配的内存上使用free()(反之亦然),任何事情都可能发生. -
delete()/free()想要一个指针作为参数。
标签: c++ memory-management malloc free