gpt4 book ai didi

c++ - map::emplace 在什么时候创建对象?

转载 作者:可可西里 更新时间:2023-11-01 16:35:25 24 4
gpt4 key购买 nike

std::map::emplace的点创建以某种方式在标准中指定的对象(即调用构造函数)?如果是,它是在检查此类 key 的存在之前发生的还是之后发生的?

在以下情况下很重要:

struct X {};
std::map<int, std::unique_ptr<X> > map;

void f(int x) {
map.emplace(x, new X);
}

如果object是先创建的,一切都很好(unique_ptr是构造出来的并拥有资源),但是如果是在check之后构造的,在重复key的情况下会出现内存泄漏。

我在 Standard 中所能找到的就是

Inserts a value_type object t constructed with std::forward<Args>(args)... if and only if there is no element in the container with key equivalent to the key of t.

这没有解决我的问题。

最佳答案

这确实是未指定的,这也是 C++17 添加 try_emplace 来确定语义的部分原因。 N3873try_emplace 提案的早期版本,对现有措辞进行了很好的讨论。

在一般情况下,它必须是“之前”,因为“之后”是无法实现的,如果强加这样的要求,标准就是有缺陷的。考虑 emplace(piecewise_construct, forward_as_tuple(foo, bar), forward_as_tuple(meow, purr))。由于键和值不需要可移动,您几乎必须先构造对象,然后再检查键是否存在,因为没有键就无法检查键是否存在。

然而,一个实现可能想要特例 emplace(key_type, something) 并不是不可想象的;当 key 存在时,避免为所需的分配 + 构造 + 销毁 + 释放支付费用通常是一件好事。

关于c++ - map::emplace 在什么时候创建对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37060326/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com