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