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
會報錯。要釋放的地址並不是使用者可以控制的