原始指针在放置并推送到智能指针向量时是否会自动转换为智能指针?

Are raw pointers automatically converted to smart pointers when emplaced and pushed to a vector of smart pointers?

本文关键字:指针 智能 是否 转换 向量 原始      更新时间:2023-10-16

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

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是创建唯一指针的首选方法。

代码有效!但是为什么?

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的指针一样多"来推理程序的正确性。在这种情况下,您有一个正确的程序,其new多于delete。这是否是一个问题,是个人意见的问题。

std::unique_ptr<Fruit> f = new Fruit();

不起作用,但

std::unique_ptr<Fruit> f{new Fruit()};

工程。第一个不起作用,因为从语法上讲,它使用副本初始化。复制初始化不适用于std::unique_ptr,因为接受指针作为参数的构造函数explicit

fruits.emplace_back(new Fruit);

由于上面使用的构造函数的存在而起作用。