class A
{
public:
A()
{
i =10;
}
private:
int i;
};
int main(){
A a;
A *p = &a;
delete p;
return 0;
}
请问这段程序运行为什么出错?
运行结果:free(): invalid pointer: 0xbfc367b8 ***
class A
{
public:
A()
{
i =10;
}
private:
int i;
};
int main(){
A a;
A *p = &a;
delete p;
return 0;
}
请问这段程序运行为什么出错?
运行结果:free(): invalid pointer: 0xbfc367b8 ***
new 是将对象的内存存放在栈中,也就是放在用户控件,内存由用户自行管理,所以内存的释放,要用delete
而A a;这种,是将对象的内存存放在堆,也就是系统控件,内存的释放由系统管理,所以使用delete会报错。要释放的地址并不是用户可以控制的
1 回答560 阅读✓ 已解决
1 回答647 阅读
579 阅读
A a产生了一个 A 对象,似乎delete &a释放 a 的内存空间是没错的。但是不要忘了,在main() {}函数结束的时候,会自动释放其中的局部变量,也就是 a,加上你写的delete,就会释放两次,所以会报错。一般情况下
new和delete对应,没用new完全不需要delete。而且尽可能保证new和delete在同一段代码块中;如果需要在两个地方分别进行操作的时候,通常是在 constructor 中 new,在 destructor 中 delete;或者在 create() 中 new,在delete()或release() 中 delete,同时注意 create() 与 delete() 配对……