gpt4 book ai didi

c++ - 删除传递给类的指针 vector

转载 作者:太空狗 更新时间:2023-10-29 21:46:32 25 4
gpt4 key购买 nike

我有一个抽象的 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;

将 vector 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 来处理删除。

关于c++ - 删除传递给类的指针 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14926685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com