我在类中有以下成员变量:
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
?
(对不起,如果我的方法不正确,我希望我明白了这一点)
答案 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
代替。