1.程序執行結果:崩潰
class A{ int i; }; class B{ A *p; public: B(){p=new A;} ~B(){delete p;} }; void sayHello(B b){ } int main(){ B b; sayHello(b); }
原因:
調用sayHello() 傳入 b 的時候,調用了默認拷貝構造函數。默認拷貝構造函數執行的是淺拷貝操作。直接把b對象中成員p的指針賦值給了新的對象。當執行完sayHello之後,新的對象析構 delete 了 原來的p。隨後結束程序前 析構了舊的對象。又一次調用了delete p。兩次delete p,就會崩潰了
C/C++開了一個特例:如果main函數沒有返回值,那麼相當於返回0。僅僅main函數如此
雙重delete,這是undefined behaviour,什麼事情都可以發生。可以崩潰,可以機器冒煙,惡魔可以從程序員或者用戶的鼻子裡冒出來,你家的貓會懷孕,或者什麼事都不發生,或者程序死循環,都可以。
sayHello的問題,參數B默認拷貝構造是淺拷貝,導致析構了兩次,崩了
嗯,是這樣,但是析構兩次的結果是undefined behaviour,不一定崩潰。