从容器中移动 unique_ptr 并擦除它是否安全?

Is it safe to move unique_ptr from a container and erase it?

我想知道以下模式是否可以安全使用并值得推荐?首先,我想将从容器中找到的 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();
}

是的,很安全。

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

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

  • 关于 // lock 的评论应该替换为作用域锁守卫。
  • 我知道这可能只是为了说明,但您在本地 unique_ptr 上调用 DoSomeExpensiveTask 而没有首先检查它是否具有值。