2013-02-17 2 views
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]; 
    } 
} 
+2

Почему вы решили использовать 'std :: vector ' вместо 'std :: vector '? – LihO

+1

@LihO Предполагаю, что он использует виртуальные функции. – Lalaland

+0

@Lalaland - это правильно. 'module_1' происходит от' module' и т. д. – Adam27X

ответ

2

Это зависит от того, как вы хотите, чтобы обращаться в собственность и, если раздел будет иметь значение семантики. Если вы копируете раздел:

Является ли копия раздела для совместного использования модулей с оригиналом. Могут ли изменения в модуле быть разделены между разделами?

Если да, вы должны использовать std::shared_ptr для своих разделов. Вся боль ушла.

Если нет, выполните для своего раздела экземпляр-конструктор и оператор присваивания, который выполняет глубокую копию списка модулей. Внедрите деструктор, который удаляет каждый модуль в списке. Это безопасно, поскольку каждый раздел имеет свои собственные объекты модуля.

В целом, я предпочитаю второй подход. Если вы не хотите внедрять глубокую копию, просто сделайте partition noncopyable или move-only и используйте std::unique_ptr для обработки удаления.

+0

Я передаю экземпляр класса 'partition' в другой класс' package'. Экземпляр класса 'package' затем передается на некоторое количество потоков, которые работают с модулями внутри. Каждый раздел имеет свой собственный набор модулей, поэтому второй подход кажется актуальным. Нужна ли мне глубокая копия для класса «package» для этого случая? – Adam27X

+0

@ Adam27X Являются ли объекты модуля потокобезопасными (т. Е. Более одного потока может использовать один и тот же объект модуля)? – WhozCraig

+0

@WhozCraig Да. Сам данный модуль никогда не обращается более чем к одному потоку, но в текущем состоянии моего кода каждый поток имеет доступ ко всем модулям, даже если он будет использовать только его конкретное подмножество. – Adam27X

Смежные вопросы