封装在共享指针中时的矢量构造

Vector construction when wrapped in a Shared Pointer

本文关键字:共享 指针 封装      更新时间:2023-10-16

因此,我正在进行从具有垃圾收集功能的OO语言到C++的转换。首先,我想将所有对象封装在共享指针中,以解决内存分配问题。现在我正在尝试将一个向量封装在一个共享指针中,并直接初始化该向量。请参阅下面的问题。为什么它不起作用,如果可能的话,我该如何使它起作用?

vector<int> vec({ 6, 4, 9 }); // Working
shared_ptr<vector<int>> vec = make_shared<vector<int>>({ 6, 4, 9 }); // Not working

很抱歉没有包含错误,我收到的错误标记在(make_shared)并打印为:

no instance of function template "std::make_shared" matches the argument list
argument types are: ({...})

谢谢你的回答!

Brace初始值设定项列表不能用于大多数类型推导上下文。

如果您明确指定其工作类型:

std::shared_ptr<std::vector<int>> vec = std::make_shared<std::vector<int>>(std::vector<int>{ 6, 4, 9 });
auto vec = make_shared<vector<int>>(std::initializer_list<int>{ 6, 4, 9 });

初始化程序列表在make_shared中不起作用。有关更多详细信息,请参阅此处:std::make_shared with std::initializer_list

但真正的解决方案可能是根本不将向量保存在智能指针中——无论如何,并不是所有东西都应该有一个智能指针。但如果你想坚持下去,这应该有效:

shared_ptr<vector<int>> vec(new vector<int>({ 6, 4, 9 }));

make_shared不支持非显式初始值设定项列表。您可以利用auto可以推导初始值设定项列表的事实:

auto init = { 6, 4, 9 };
auto vec = std::make_shared<std::vector<int>>(init); 

但正如其他人所指出的,您需要考虑是否需要shared_ptrvector管理自己的内存。shared_ptr不是空闲的。