从容器中移动unique_ptr并将其删除是否安全?

时间:2016-12-19 21:21:50

标签: c++ multithreading locking unique-ptr

我想知道以下模式是否可以安全使用和推荐?首先,我想将从容器中找到的unique_ptr移动到另一个临时unique_ptr,然后将其从容器中删除。然后,使用移动的指针调用实际方法。

这是为了避免在调用一些昂贵的方法时锁定整个容器。

请参阅以下示例:

std::unordered_map<string, std::unique_ptr<Sample>> samples;

std::unique_ptr<Sample> ptr_to_remove;

// Lock (reader lock) samples here.
auto it = samples.find(name);
if (it != samples.end()) {
   ptr_to_remove = std::move(it->second);
   samples.erase(it);
}
// Unlock samples here.

if (ptr_to_remove) {
    ptr_to_remove->DoSomeExpensiveTask();
}

1 个答案:

答案 0 :(得分:2)

是的,这很安全。

unordered_map的值类型不是const,因此您可以修改它。从unique_ptr移动是安全的。从地图中删除项目将调用unique_ptr上的析构函数,这将破坏现在为空的unique_ptr,这也是安全的。

代码示例中唯一可能不安全的部分是:

  • 有关// lock的评论应替换为范围锁定保护。
  • 我意识到这可能只是为了说明,但你在本地DoSomeExpensiveTask上调用unique_ptr而没有先检查它是否有值。