封装在共享指针中时的矢量构造
Vector construction when wrapped in a Shared Pointer
因此,我正在进行从具有垃圾收集功能的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_ptr
,vector
管理自己的内存。shared_ptr
不是空闲的。
相关文章:
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 使用共享指针实现复制 c'tor?
- 共享指针继承,而不先显式强制转换
- 如何检查类中共享指针的有效性?
- std::排序在共享指针的向量上
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 嵌套类、继承和C++中的共享指针
- 制作一对共享指针并推送一个向量
- 如何将共享指针用作函数参数
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 尝试通过共享指针使用变量时读取访问冲突
- 如何将元素插入到标准::地图的共享指针中?
- 共享指针生存期
- 初始化可变数据结构中的共享指针向量
- 阻止在返回时复制共享指针