删除传递给类的指针向量
Deleting a vector of pointers passed to a class
我有一个特定模块派生的抽象module
类。在运行时,我解析一个配置文件,并确定配置文件中每个模块的特定模块类型:
std::vector<module*> modules;
module *temp;
//Let nm be the result of parsing as a std::string
if(nm == "type1")
{
temp = new module_1(...);
}
else if(nm == "type2")
{
temp = new module_2(...);
}
else if(nm == "type3")
{
temp = new module_3(...);
}
else
{
//Syntax error
return -1;
}
modules.push_back(temp);
partition p;
p.modules = modules;
将矢量modules
交给partition
类:
class partition
{
public:
//Member functions
private:
//...Other variables
std::vector<module*> modules;
};
一旦我处理完这些模块指针,释放内存的正确方法是什么?我试图在partition
类的析构函数中删除它们,如下所示,但最终出现了分段错误:
partition::~partition()
{
for(unsigned i=0; i<modules.size(); i++)
{
delete modules[i];
}
}
这取决于您希望如何处理所有权,以及分区是否具有值语义。想想如果你复制一个分区会发生什么:
是要与原始分区共享模块的分区的副本。模块中的更改是否要在分区之间共享?
如果是,则应该为分区使用std::shared_ptr
。所有的痛苦都消失了。
如果没有,请为执行模块列表深度复制的分区实现一个复制构造函数和赋值运算符。实现一个析构函数,删除列表中的每个模块。这是安全的,因为每个分区都有自己的模块对象。
总的来说,我赞成第二种方法。如果您不想实现深度复制,只需使partition
不可复制或仅移动,并使用std::unique_ptr
来处理删除。
相关文章:
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 如何更改唯一指针向量的可见性
- 如何在基类指针向量的元素上应用重载的多态函数
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- 包含指向其他结构的指针向量的结构
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 如何将字符串指针数组转换为字符串类型的智能指针向量?
- 初始化可变数据结构中的共享指针向量
- 指向具有 decltype 的函数的指针向量
- push_back指向指针向量的指针
- 使用指针向量(带代码)C++(以及对其使用的便利性的怀疑)时出现问题
- 我可以做些什么来改进指针向量中的此搜索?
- 指向指针排序向量的指针向量的 C++ 向量
- 初始化用户定义类的指针向量
- 函数无法识别我在C++传递节点指针向量?
- 如何声明指向类对象的指针向量?
- 指向结构的指针向量的元素具有相同的地址
- 删除指向抽象类的指针向量
- 当我返回指向结构的指针向量时出现段错误
- 用基于范围的for循环填充指针向量