将原始指针放在并推入智能指针矢量时,它们是否会自动转换为智能指针?

Nur*_*yev 3 c++ pointers vector

我偶然发现了这样的代码:

std::vector<std::unique_ptr<Fruit>> fruits;
fruits.emplace_back(new Fruit);
Run Code Online (Sandbox Code Playgroud)

从这里

因此,在代码中,我们将一个原始指针(new产生一个原始指针,对吗?)推入唯一指针的向量中。和代码的作品!但为什么?

因为这不能编译:

std::unique_ptr<Fruit> f = new Fruit();
Run Code Online (Sandbox Code Playgroud)

为了方便起见,这是不是有点不可思议?

此外,这种方法而不是显式的可能存在的陷阱是fruits.emplace_back(std::make_unique<Fruit>())什么?我读过这make_unique是创建唯一指针的首选方法。

eer*_*ika 5

和代码的作品!但为什么?

vector::emplace_back 接受参数列表,并将其转发到它创建的元素的构造函数。

unique_ptr<Fruit>::unique_ptr(Fruit*) 是一个构造函数,它拥有传递的裸指针的所有权。

另外,用这种方法代替[ make_unique] 可能会遇到什么陷阱?

最大的陷阱是emplace_back可能引发异常,在这种情况下,没有unique_ptr成功创建任何异常。在这种情况下,传递给的分配对象emplace_back()将被泄漏。因此,最好传递一个unique_ptr裸指针而不是裸指针,这样原始指针始终由某人拥有。

关于使用new代替而不是std::make_unique()一般的要点:它使程序“不平衡”,从而防止您使用古老的经验法则“ delete与您一样多的指针”来推理程序的正确性new。在这种情况下,你有一个正确的程序更newdelete。这是否是一个问题,取决于个人意见。

  • 这种对new的使用是正确的,除了由于缺乏内存而抛出vector.emplace_back的特殊情况。在这种情况下,“新水果”会泄漏。 (2认同)