在向量中访问对象T <unique_ptr <t>&gt;没有取得所有权

时间:2015-10-23 13:41:21

标签: c++11 vector unique-ptr

我在类中有以下成员变量:     std::vector<std::unique_ptr<Object>> objects_;

我明确希望向量始终保持所有权。我已经看到了一些建议,为了让成员函数访问向量中的指针并对T中包含的对象std::unique_ptr进行更改,我们必须将指针移动到调用代码,即:

    void foo(int i) {
        auto object = std::move( vector.at( i ) );  // move object to caller (caller owns)
        object->dosomething(); 
        vector.at(i) = std::move(object); // move back into vector (vector owns)
    }

另一种方法是使用原始指针:

    void foo(int i) {
        Object* object = vector.at( i ).get();
        object->doSomething();
    }

但是,我一直在努力:

    void foo(int i) {
        auto& object = vector.at( i );
        object->doSomething();
    }

对于我的案例,哪种方法最正确,最有效?此功能是否取得std::unique_ptr中数据的所有权?有没有办法在不使用Object的情况下访问std::unique_ptr

(对不起,如果我的方法不正确,我希望我明白了这一点)

1 个答案:

答案 0 :(得分:0)

如果object->dosomething()抛出异常(即它不是异常安全的),第一种方法将不会保留对象的所有权,因为第二个std::move()语句将不会被执行。

假设C ++ 11,其他两种方法实际上是等效的,假设所拥有的指针不为空。在相同的假设下,代码可以简化为

void foo(int i)
{
    vector.at(i)->doSomething();
}

适用于所有C ++标准(不仅仅是C ++ 11或更高版本)。

可以在不使用unique_ptr的情况下访问对象 - 只需将指针存储在其他地方并使用它。但是,这确实会影响首先使用std::unique_ptr的目的。并且容易出错 - 例如,std::unique_ptr可以破坏对象,并保留其他指针悬空。

如果您真的担心矢量失去所有权的可能性,请考虑使用shared_ptr代替。