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是创建唯一指针的首选方法。
和代码的作品!但为什么?
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。这是否是一个问题,取决于个人意见。