程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 筆試題總結,筆試題

筆試題總結,筆試題

編輯:C++入門知識

筆試題總結,筆試題


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,不一定崩潰。

 

 

 

 

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved