【发布时间】:2019-03-16 19:18:51
【问题描述】:
在下面的代码中,我有一个 int 指针和 int 变量作为类的数据成员。我创建了一个类的实例并打印指针指向的值。
执行代码时,我得到以下输出。错误来自于调用析构函数时:
b1.ptr 15
malloc: *** error for object 0x7ffeefbff49c: pointer being freed was not allocated
代码:
#include <iostream>
using namespace std;
class base{
public:
int * ptr;
int val;
base(int &v1): ptr(&v1){
val = 20;
}
~base(){
delete ptr;
}
};
int main(int argc, const char * argv[]) {
int val = 15;
base b1 = base(val);
cout << "b1.ptr " << *(b1.ptr) << endl;
return 0;
}
【问题讨论】:
-
错误信息很清楚。您没有使用 new 分配指针指向的内存,因此您无法删除它。您传递的变量
val分配在堆栈上。 -
如果您使用
delete ptr,您有责任通过确保ptr是相应new表达式的结果来避免未定义的行为。你还没有这样做。在您的示例中,构造函数中的&v1是main()中变量的地址,并且该变量不是使用运算符new的任何变体分配的。