сколько делает деструктор по умолчанию - PullRequest
9 голосов
/ 31 марта 2012

Деструктор по умолчанию в классах C ++ автоматически удаляет элементы, которые явно не выделены в коде? Например:

class C {
  public:
    C() {}
    int arr[100];
};

int main(void) {
  C* myC = new C();
  delete myC;
  return 0;
}

Удаляет ли myC освобождает ли myC arr автоматически? Или мне нужно написать деструктор C, чтобы сделать это явно?

Ответы [ 5 ]

6 голосов
/ 31 марта 2012

Конструктор (при отсутствии ctor-initializer-list ) вызывает конструктор по умолчанию для каждого подобъекта.

Поскольку у вас нет базовых классов, а переменные-члены являются примитивными типами, он ничего не будет делать.

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

Теперь вся память класса будет освобождена, когда вы удалите ее.Поскольку массив встроен в класс, он является частью той же области памяти и будет освобожден одновременно.

5 голосов
/ 31 марта 2012

Если ваш класс / структура содержит указатель, и вы явно выделяете что-то, на что этот указатель будет ссылаться, то обычно вам нужно записать соответствующее delete в dtor.Члены, которые непосредственно встроены в класс / структуру, будут созданы и уничтожены автоматически.

class X { 
    int x; 
    int *y;
public:
    X() : y(new int) {}
    ~X() : { delete y; }    
};

Здесь X :: x будет создан / уничтожен автоматически.X :: y (или, если быть технически правильным, на что указывает X :: y) не будет - мы размещаем его в ctor и уничтожаем его в dtor.

5 голосов
/ 31 марта 2012

Неявно определенный (по умолчанию) деструктор будет вызывать деструктор для каждого члена.В случае массива-члена он вызовет деструктор для каждого элемента массива.

Обратите внимание, что указатели не имеют деструкторов;вам нужно вручную удалить их.У вас нет этой проблемы в предоставленном примере, но об этом нужно знать.

0 голосов
/ 31 марта 2012

Вам не нужно писать деструктор.Класс C ++ имеет деструктор по умолчанию для удаления объекта после «возврата 0» для перезапуска памяти.

0 голосов
/ 31 марта 2012

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

...