3

我有一个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];
    }
}
4

1 回答 1

2

这取决于您希望如何处理所有权以及分区是否将具有值语义。想想如果你复制一个分区会发生什么:

分区的副本是否将与原始分区共享模块。模块中的更改是否要在分区之间共享?

如果是,您应该使用 astd::shared_ptr作为您的分区。所有的痛苦都消失了。

如果没有,请为您的分区实现一个复制构造函数和赋值运算符,以执行模块列表的深拷贝。实现一个析构函数,删除列表中的每个模块。这是安全的,因为每个分区都有自己的模块对象。

总的来说,我赞成第二种方法。如果您不想实现深度复制,只需将其设为不可复制partition或仅移动并用于std::unique_ptr处理删除。

于 2013-02-17T22:31:57.720 回答