包含在共享指针中的矢量结构

时间:2015-03-05 12:04:49

标签: c++ vector initialization shared-ptr

所以我正在进行从具有垃圾收集功能的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: ({...})

感谢您的回答!

4 个答案:

答案 0 :(得分:10)

Brace初始化列表不能用于大多数类型的演绎上下文。

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

初始化列表与make_shared的效果不佳。有关详细信息,请参阅此处:std::make_shared with std::initializer_list

但可能真正的解决方案是根本不将智能指针放在智能指针中 - 不管怎样都不应该使用智能指针。但如果你想坚持下去,这应该有效:

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

答案 3 :(得分:0)

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

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

但正如其他人所指出的,你需要考虑是否需要shared_ptrvector管理自己的记忆。 shared_ptr不是免费的。