如何在具有移动语义的容器之间移动shared_ptr对象?

时间:2013-07-02 22:39:23

标签: c++ c++11

我有两个向量,其中包含指向程序中共享对象的指针:

typedef shared_ptr<T> sp;
std::vector<sp> v1;
std::vector<sp> v2;

有时我想将一个 sp 类型的对象从v1的末尾移动到v2的末尾。这部分代码是我程序中的一个重要瓶颈,因为我在移动后不需要v1中的值,我认为如果我移动它们而不是复制,我可以避免额外的计数器递增/递减,对吧?所以这就是我所做的:

// move constructor for new element of v2:
v2.emplace_back(v1.back());

// the move constructor should have made the element in v1 null:
assert(v1.back() == nullptr); // FAIL - why?

// now remove the dead element at the end of v1
v1.pop_back();

我在这里做错了什么?这不是正确的方式吗?使用不同指针类型的BTW不是一个选项 - 类型T是非常明确地共享的(仅在这个特定的实例中!)。

编辑:以下是我对David的解决方案的实施:

// move constructor for new element of v2:
v2.emplace_back(std::move(v1.back()));

// the move constructor should have made the element in v1 null:
assert(v1.back() == nullptr); // ok!

// now remove the dead element at the end of v1
v1.pop_back();

1 个答案:

答案 0 :(得分:6)

您没有调用移动构造函数。 emplace_back来电没有任何内容表明不再需要v1。你可能需要std::move

你可能想要:

v2.emplace_back(std::move(v1.back()));
v1.pop_back();