从容器中移动 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
而没有首先检查它是否具有值。
我想知道以下模式是否可以安全使用并值得推荐?首先,我想将从容器中找到的 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
而没有首先检查它是否具有值。