【问题标题】:emplace_back with pointer and unique pointers带有指针和唯一指针的 emplace_back
【发布时间】:2017-06-25 14:08:42
【问题描述】:

关于someFunctionOnesomeFunctionTwo

当每个都放入地图时,最终结果是否仍然相同?

指针是否升级为智能指针?

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


【解决方案1】:

指针是否升级为智能指针?

正确的术语是Implicit type conversion。但是,是的,这就是这一行会发生的事情:

m_map.emplace(id, myStruct);

这是因为 unique_pointer 有一个具有签名的单值构造函数:

explicit unique_ptr( pointer p ) noexcept;

这就是将指针转换为 unique_ptr 的方法。

【讨论】:

    猜你喜欢
    • 2022-01-04
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2013-04-28
    相关资源
    最近更新 更多