我想知道以下模式是否可以安全使用和推荐?首先,我想将从容器中找到的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();
}
答案 0 :(得分:2)
是的,这很安全。
unordered_map
的值类型不是const
,因此您可以修改它。从unique_ptr
移动是安全的。从地图中删除项目将调用unique_ptr
上的析构函数,这将破坏现在为空的unique_ptr
,这也是安全的。
代码示例中唯一可能不安全的部分是:
// lock
的评论应替换为范围锁定保护。 DoSomeExpensiveTask
上调用unique_ptr
而没有先检查它是否有值。