在我的代码中,我有一个本地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 :(得分:4)
所有关于所有权。您是否希望some_function
获取指针的所有权?如果没有,您只需将原始指针传递给some_function
即可。如果您希望some_function
获得所有权(并返回所有权),则应按unique_ptr
取值。否则,return语句(应该是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));
任何一种设计都可以。它只取决于应该拥有指针的代码(特别是如果在某个时刻抛出异常)。
答案 1 :(得分:0)
(忽略代码中无关的语法错误。请参阅上面的评论。)
就您的代码段而言,您的代码有效。移动的详细程度是您以这种方式使用std::unique_ptr
以及将unique_ptr
传递给函数而不是对对象本身的引用所支付的价格。
我想你有充分的理由希望some_function
采取std::unique_ptr
,如果是这样的话,那么据我所知,你不能做得更好。
如果你没有有充分的理由,那么,那就是你的答案。 :)
希望有所帮助。
答案 2 :(得分: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(...))));