【发布时间】:2017-06-25 14:08:42
【问题描述】:
关于someFunctionOne 和someFunctionTwo。
当每个都放入地图时,最终结果是否仍然相同?
指针是否升级为智能指针?
struct MyStruct {
int x = 0;
};
std::unordered_map<int, std::unique_ptr<MyStruct>> m_map;
void someFunctionOne(int id, std::unique_ptr<MyStruct>& myStruct){
m_map.emplace(id, std::move(myStruct));
}
void someFunctionTwo(int id, MyStruct * myStruct){
m_map.emplace(id, myStruct);
}
int main()
{
someFunctionOne(452, std::make_unique<MyStruct>());
someFunctionTwo(10, new MyStruct);
m_map.clear();
return 0;
}
【问题讨论】:
-
我认为如果
emplace在扩展映射时抛出OOM异常,第二个可能会导致内存泄漏。除此之外,它们是等价的。我会使用第一个,因为它明确了所有权。 -
第一个实际上并没有编译。您需要一个右值引用或按值传递。您可以而且应该至少在此处发布之前尝试一下。
-
@aschepler 闻起来像臭名昭著的 MSVC 扩展,它将左值引用绑定到右值...
-
@Quentin 你能解释一下吗?
-
@user3220058 在 MSVC 中默认启用了一个 C++ 扩展,即使它不是有效的 C++,它也允许您的代码编译。您可以使用
/Za标志来禁用扩展。
标签: c++ pointers dictionary unique unique-ptr