Деструктор по умолчанию, освобождающий член массива класса, c ++ - PullRequest
0 голосов
/ 29 августа 2011

Скажите, у меня есть следующие классы:

class A {};

Class C {
private:
    A a[10];
};

int main() {
    C c;
}

Будет ли этот код вызывать утечку памяти? Например, будет ли деструктор по умолчанию, который будет определен компилятором для класса C, успешно освободить память массива объектов A?

Я пытался проверить себя, но не мог понять, как запустить valgrind на OSX 10.7 ...

Ответы [ 3 ]

2 голосов
/ 29 августа 2011

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

РЕДАКТИРОВАТЬ: простой пример ...

#include <iostream>

class A 
{
public:
  A() { std::cout << "A::A()" << std::endl; }
  ~A() { std::cout << "A::~A()" << std::endl; }
};

Class C {
private:
    A a[10];
};

int main() {
    C c;
}

Теперь компиляция и запуск приведенного выше примера, должныпроизвести 10 экземпляров первого оператора отладки и 10 экземпляров второго оператора отладки.Последние 10 операторов создаются, когда 10 экземпляров A уничтожены (что делается автоматически для вас - отсюда и термин автоматическое хранение , когда они выходят за рамки - в данном случае, когдаэкземпляр C [которому они принадлежат] выходит за рамки [в конце main].)

2 голосов
/ 29 августа 2011

Проблема утечки памяти возникает только для динамического выделения памяти.Для автоматически выделенной памяти (обычно в стеке или сегменте данных) утечки памяти никогда не бывает.

2 голосов
/ 29 августа 2011

Нет, это не приведет к утечке памяти. Классы вообще не используют new , поэтому в динамической памяти нет динамически выделяемой памяти.

...