我想知道以下模式是否可以安全使用并且值得推荐?首先,我想将从容器中找到的 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
转移是安全的。从 map 中删除该项目将调用 unique_ptr
上的析构函数,这将销毁现在为空的 unique_ptr
,这也是安全的。
代码示例中唯一可能不安全的部分是:
- 有关
//lock
的注释应替换为作用域锁防护。 - 我意识到这可能只是为了说明,但您在本地
unique_ptr
上调用DoSomeExppressiveTask
,而没有首先检查它是否有值。
关于c++ - 从容器中移动 unique_ptr 并将其删除是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41231210/