84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
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
会报错。要释放的地址并不是用户可以控制的