2014-05-05 41 views
2

我想弄清楚這段代碼打印的內容,但由於某種原因我無法輸出它,它給了我一個錯誤:「1 [main] Q1c 5752 open_stackdumpfile:轉儲堆棧跟蹤到Q1c.exe.stackdump「。C++中的自動指針(auto_ptr)

double *dp=new double(1.2); 
auto_ptr <double> autodp1(dp); 
auto_ptr <double> autodp2=autodp1; 
cout<<*autodp1<<endl; 

我只是想知道它會打印什麼,如果它甚至打印。

注意:這個問題在以前的考卷中,只是爲了修改。

+2

'auto_ptr'非常難以使用,更不用說正確使用了。除非你是C++專家,否則不要使用它。 –

+3

未定義的行爲。它甚至可以打印'「失敗!」'。 – juanchopanza

+0

@KerrekSB我沒有使用它,這只是一個問題,我想知道答案。 –

回答

5

代碼*autodp1實際上是一個空指針的解引用。因此該代碼展示未定義的行爲。

您首先構造autodp1指向新分配的double。但是然後autodp2的構造函數爲自己獲取擁有的內存並將autodp1設置爲null。

+0

好吧,那麼我想這就是這個問題的答案。 謝謝@JurajBlaho –

+2

然後請標記它,所以Juraj得到適當的榮譽。 –

+0

對不起,我忘了,完成。 –

1

這是becouse的auto_ptr的運營商assignement採取的所有權(移動)指針

採取維基讀,這是相當不錯的一般解釋:

http://en.wikipedia.org/wiki/Smart_pointer

「的拷貝構造函數和賦值std :: auto_ptr的操作符實際上並不複製已存儲的指針,而是將其轉移,而保留之前的std :: auto_ptr對象爲空,這是實現嚴格所有權的一種方式,因此只有一個auto_ptr對象可以擁有指針任何給定的時間,這意味着auto_ptr不應該是用於需要複製語義的地方。「