2012-03-17 18 views
1

在下面的代碼片段中,是否有任何需要考慮的注意事項?將一個指針提取到C++中的引用中

void do_stuff() 
{ 
    std::unique_ptr<my_type> my(new my()); 

    my_type& mine = *my; 

    //use mine 
} 

它給了我一種奇怪的感覺,通過取消引用隱式指針「帶出」我的價值,因爲它感覺像它會創建一個臨時的(但我敢肯定,這不是這種情況)

+0

你能解釋爲什麼這是一個壞問題嗎? (downvoter) – Max 2012-03-17 21:30:19

回答

3

對於持有引用(或指針)的對象,通常需要注意的代碼很好:您必須確保對象不再使用指針或引用。

在這種特殊情況下,確保了unique_ptr裏面的對象沒有得到通過調用刪除,reset()delete my.release();我認爲在哪裏是參考的壽命可能活得比對象本身的生命週期的唯一案例。

附註:我假設你有充分的理由使用該對象的動態分配。如果你不確定,首先考慮不要使用指針/ new。

我還假設性能的參考是不存在的,如果是,您可能要考慮通過引用訪問或智能指針將被轉換爲完全相同的二進制文件。

+0

謝謝。我不想在代碼片段中顯示,但我想傳遞這個指針,而不是每個方法都依賴於'std :: unique_ptr '。有時候我可能會傳遞一些沒有封裝在unique_ptr中的東西。您認爲這是一個很好的用例嗎? – Max 2012-03-17 21:34:30

+0

第一個問題是對象是否超出此功能。如果沒有,首先避免使用動態分配的內存。你可以通過* address-of *操作符獲得來自本地對象的指針:'&obj'。如果*必須使用動態內存,並且對象有一個*所有者*,那麼'unique_ptr'沒有問題,並且傳遞一個原始指針或引用給一個函數,該函數不會持有指針/引用的時間超過你的函數的持續時間也很好,你只是調整接口,這不是一個問題*如果他們不會保持引用時間太長* – 2012-03-17 22:53:15

0

除了沒有多少意義(至少在代碼片段中),代碼是沒問題的,如果在my的構造和對引用的賦值之間沒有任何內容。

+0

簡潔和表達之間總是有一個折衷。我選擇從我的例子中刪除大部分細節。如果你有點感興趣,請閱讀我對@DavidRodriguez的評論中的示例:)在*你的*意見中,這是一個很好的「用例」嗎? – Max 2012-03-17 21:36:27

+0

@最好的。如果你的對象在免費商店中擁有某些東西,並且你提交了引用,這很好。但是,接下來只需在課堂上按價值存儲對象,並避免所有的麻煩。 – pmr 2012-03-17 21:53:59

0

確保指針超過(使用)引用。

一個簡單的方法來做到這一點是使用const

void doStuff() 
{ 
    auto const p = std::unique_ptr<MyType>(new MyType); 
    MyType& m = *p; 

    // use m 
} 

當然,如果沒有什麼特別的理由,更喜歡動態分配(如大小,或特殊分配器),那麼就使用自動分配MyType對象,即直接將其聲明爲局部變量而不使用單詞static