2011-05-07 151 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(...)))); 
相关问题