84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
class A { public: A() { i =10; } private: int i; }; int main(){ A a; A *p = &a; delete p; return 0; }
请问这段程序运行为什么出错? 运行结果:free(): invalid pointer: 0xbfc367b8 ***
ringa_lee
cppint main(){ A a; A *p = &a; delete p; return 0; }
cpp
int main(){ A a; A *p = &a; delete p; return 0; }
A a 产生了一个 A 对象,似乎 delete &a 释放 a 的内存空间是没错的。但是不要忘了,在 main() {} 函数结束的时候,会自动释放其中的局部变量,也就是 a,加上你写的 delete,就会释放两次,所以会报错。
A a
delete &a
main() {}
delete
一般情况下 new 和 delete 对应,没用 new 完全不需要 delete。而且尽可能保证 new 和 delete 在同一段代码块中;如果需要在两个地方分别进行操作的时候,通常是在 constructor 中 new,在 destructor 中 delete;或者在 create() 中 new,在delete()或release() 中 delete,同时注意 create() 与 delete() 配对……
new
没有new过的地址是不需要delete的,new和delete应该是配对的
new 是将对象的内存存放在栈中,也就是放在用户控件,内存由用户自行管理,所以内存的释放,要用delete 而A a;这种,是将对象的内存存放在堆,也就是系统控件,内存的释放由系统管理,所以使用delete会报错。要释放的地址并不是用户可以控制的
栈
堆
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() 配对……没有new过的地址是不需要delete的,new和delete应该是配对的
new 是将对象的内存存放在
栈
中,也就是放在用户控件,内存由用户自行管理,所以内存的释放,要用delete
而
A a
;这种,是将对象的内存存放在堆
,也就是系统控件,内存的释放由系统管理,所以使用delete
会报错。要释放的地址并不是用户可以控制的