2011-05-07 68 views
2

我的代碼中的某處我有一個本地的std::unique_ptr<T>。我需要做的東西與指向的對象,我用一個函數,該函數:修改由std :: unique_ptr指向的對象的函數<T>

std::unique_ptr<T> some_function(std::unique_ptr<T> &t) 
{ 
    // do stuff 
    return t; 
} 

我這樣調用該函數:

std::unique_ptr<T> some_T_ptr(new T(/*args*/)); 
vector_of_finalized_Ts.push_back(std::move(some_function(std::move(some_T_ptr)))); 

現在我不知道,有沒有更好的方式來獲得必要的功能?這似乎有兩個動作是非常多餘和潛在的危險。我確實有錯誤處理代碼,我沒有在這裏展示,但那不是重點。

+0

'T some_T = new T(/ * args * /);'是無效的C++。 – 2011-05-07 18:59:07

+0

@Tomalak:已更正。 – rubenvb 2011-05-07 19:03:24

+0

你的代碼顯示一個右值被傳遞給'some_function',但'some_function'通過非const左值引用獲得它的參數。此代碼無效。 – 2011-05-07 19:15:16

回答

4

這是關於所有權。你是否想要some_function獲得指針的所有權?如果沒有,你可以傳遞一個原始指針到some_function。如果您想要some_function取得所有權(並返回所有權),則應按價值取unique_ptr。否則,返回聲明(應該是std::move(t))將從未知來源的參考移動。

std::unique_ptr<T> some_function(std::unique_ptr<T> t) 
{ 
    // I own t here and will delete it if an exception happens 
    // do stuff 
    // I'm transferring ownership back to the caller 
    //  (who may or may not accept ownership) 
    return std::move(t); 
} 

vector_of_finalized_Ts.push_back(some_function(std::move(some_T_ptr))); 

或:

void some_function(T* t) 
{ 
    // I don't own t and won't delete it if an exception happens 
    // do stuff 
} 

some_function(some_T_ptr.get()); 
vector_of_finalized_Ts.push_back(std::move(some_T_ptr)); 

無論是設計好的。它只取決於哪些代碼應該擁有指針(特別是在某個點拋出異常的情況下)。

0

(忽略你的代碼無關的語法錯誤。見上面,我的評論。)

至於你的片斷去,你的代碼是有效的。移動的詳細程度是您以這種方式使用std::unique_ptr並且將unique_ptr傳遞給函數而不是對象本身的引用所支付的價格。

我想你有想some_function採取std::unique_ptr,如果是這樣的話,那麼據我可以告訴你真的不能做任何更好的理由。

如果你不要有你的好理由,那麼,你的答案就是這樣。 :)

希望有所幫助。

0

你的問題是,你們都參考unique_ptr返回它。這是一個獨特的指針 - 你認爲它喜歡共享指針,並且在堆棧上留下了一個浪費的值nullptr。如果按值或右值引用它,則可以直接調用some_function,而不必移動結果。

std::unique_ptr<T> some_function(std::unique_ptr<T> &&t) 
{ 
    // do stuff 
    return t; 
} 
vector_of_finalized_Ts.push_back(some_function(std::unique_ptr<T>(new T(...)))); 
相關問題