2017-02-20 4 views
0

Я разрабатываю класс для обработки файлов конфигурации, состоящих из нескольких сегментов, каждый сегмент с несколькими элементами: значение. У меня есть следующий код (урезано до только основной вопрос):C++ Как уничтожить класс Destructor

class cfgElement { 
    public: 
     char  *key; 
     char  *val; 
     cfgElement *link; 

     cfgElement() { 
      key = nullptr; 
      val = nullptr; 
      link = nullptr; 
     } 

     ~cfgElement() { 
      if (key != nullptr) delete key; 
      if (val != nullptr) delete val; 
      key = nullptr; 
      val = nullptr; 
      link = nullptr; 
     } 
}; 

struct cfgSegment { 
    char  Name[16]; 
    cfgElement head; 
}; 

class config { 
    private: 
     cfgSegment *segments; 

    public: 
     config() { 
      segments = new cfgSegment[5]; 
     } 

     ~config() { 
      for (int i=0; i<5; i++) { 
       // Clean up segments[i].head 
      } 
     } 
}; 

Если я объявляю cfgElement в основном коде, это, конечно, вызывает деструктор, как и ожидалось. Те, которые являются частью массива segments[], не запускаются, когда объект config выходит за пределы области видимости, и я могу понять, почему нет, но есть ли способ получить деструктор для запуска для них? Я не могу delete их, так как они не указатели.

Я мог бы сделать head элемент cfgSegment указатель, и цикл над segments[] массива в config конструктора, выделяя каждый cfgElement по отдельности, но в том, что единственный способ сделать это?

+1

does 'delete [] segment;' work? Внутри '~ config()' без цикла for. –

+3

Пожалуйста, научитесь использовать std :: string вместо char * и умные указатели (u.e.std :: unique_ptr) instad «raw» указателя, ваша жизнь будет проще. – roalz

+2

@roalz Да, я понимаю, что строки и умные указатели проще в использовании, но по мере того, как я учусь, я хочу сделать что-то трудное, чтобы понять эти проблемы. – alanlittle

ответ

1

Вам нужно просто удалить сегменты, а не удалять каждый объект в цикле.

~config() { 
     delete[] segments; 
    } 
+0

Хм, мне показалось, что я пробовал это раньше, и компилятор жаловался на 'delete'ing массив. Однако ваше решение работает так, как рекламируется. Благодаря! – alanlittle

+0

'delete' работает с отдельными объектами,' delete [] 'работает с массивами. Фактически оба варианта должны работать, но 'delete' на массиве вызовет утечку памяти. –

+0

Собственно, то, что я пробовал раньше, в 'main()' было просто 'int x [5]; delete [] x; 'и компилятор сказал' [Warning] удаление массива 'x''. Я не уверен, в чем разница, помещая его в деструктор; насколько я вижу, это, по сути, одно и то же. Ах, нет, я вижу разницу. 'сегменты []' действительно динамически распределены. – alanlittle