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