修改std :: unique_ptr <t> </t>指向的对象的函数

时间:2011-05-07 18:55:22

标签: c++11 move unique-ptr

在我的代码中,我有一个本地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))));

现在我想知道,有没有更好的方法来获得必要的功能?看起来似乎有两个动作是多余的并且有潜在危险。我确实有错误处理代码,我没有在这里展示,但这不是重点。

3 个答案:

答案 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(...))));