【发布时间】:2019-09-06 22:12:01
【问题描述】:
我偶然发现了这样的代码:
std::vector<std::unique_ptr<Fruit>> fruits;
fruits.emplace_back(new Fruit);
所以在代码中我们有一个原始指针(new 产生一个原始指针,对吗?)推入一个唯一指针向量。并且代码有效!但为什么?
因为这不会编译:
std::unique_ptr<Fruit> f = new Fruit();
为了方便起见,是不是有点神秘?
此外,这种方法而不是明确的fruits.emplace_back(std::make_unique<Fruit>()) 可能存在哪些缺陷?我读过make_unique 是创建唯一指针的首选方法。
【问题讨论】:
-
请注意,对
emplace_back的调用有一个错误:如果emplace_back抛出异常(内存不足),则会泄漏new Fruit。 -
@Justin 你是指一般情况下,还是在这种情况下?
-
这个案例。一般来说,如果你在
emplace_back的调用中分配资源,期望资源归std::vector中创建的元素所有,如果分配失败,你会泄漏资源。 -
std::unique_ptr<Fruit> f(new Fruit());确实可以编译,并且等效于emplace_back所做的 -
@Justin 啊,我想我明白了,所以向量将无法释放分配的
Fruit。