删除传递给类的指针向量

Deleting a vector of pointers passed to a class

本文关键字:指针 向量 删除      更新时间:2023-10-16

我有一个特定模块派生的抽象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来处理删除。