在下面的代碼片段中,是否有任何需要考慮的注意事項?將一個指針提取到C++中的引用中
void do_stuff()
{
std::unique_ptr<my_type> my(new my());
my_type& mine = *my;
//use mine
}
它給了我一種奇怪的感覺,通過取消引用隱式指針「帶出」我的價值,因爲它感覺像它會創建一個臨時的(但我敢肯定,這不是這種情況)
在下面的代碼片段中,是否有任何需要考慮的注意事項?將一個指針提取到C++中的引用中
void do_stuff()
{
std::unique_ptr<my_type> my(new my());
my_type& mine = *my;
//use mine
}
它給了我一種奇怪的感覺,通過取消引用隱式指針「帶出」我的價值,因爲它感覺像它會創建一個臨時的(但我敢肯定,這不是這種情況)
對於持有引用(或指針)的對象,通常需要注意的代碼很好:您必須確保對象不再使用指針或引用。
在這種特殊情況下,確保了unique_ptr
裏面的對象沒有得到通過調用刪除,reset()
或delete my.release();
我認爲在哪裏是參考的壽命可能活得比對象本身的生命週期的唯一案例。
附註:我假設你有充分的理由使用該對象的動態分配。如果你不確定,首先考慮不要使用指針/ new。
我還假設性能的參考是不存在的,如果是,您可能要考慮通過引用訪問或智能指針將被轉換爲完全相同的二進制文件。
謝謝。我不想在代碼片段中顯示,但我想傳遞這個指針,而不是每個方法都依賴於'std :: unique_ptr
第一個問題是對象是否超出此功能。如果沒有,首先避免使用動態分配的內存。你可以通過* address-of *操作符獲得來自本地對象的指針:'&obj'。如果*必須使用動態內存,並且對象有一個*所有者*,那麼'unique_ptr'沒有問題,並且傳遞一個原始指針或引用給一個函數,該函數不會持有指針/引用的時間超過你的函數的持續時間也很好,你只是調整接口,這不是一個問題*如果他們不會保持引用時間太長* – 2012-03-17 22:53:15
確保指針超過(使用)引用。
一個簡單的方法來做到這一點是使用const
:
void doStuff()
{
auto const p = std::unique_ptr<MyType>(new MyType);
MyType& m = *p;
// use m
}
當然,如果沒有什麼特別的理由,更喜歡動態分配(如大小,或特殊分配器),那麼就使用自動分配爲MyType
對象,即直接將其聲明爲局部變量而不使用單詞static
。
你能解釋爲什麼這是一個壞問題嗎? (downvoter) – Max 2012-03-17 21:30:19