В C ++, если объект создается внутри метода, автоматически ли освобождается память, используемая объектом, после завершения метода? - PullRequest
0 голосов
/ 14 ноября 2011

В коде, над которым я сейчас работаю, у меня есть метод, принадлежащий классу, который сам создает экземпляр другого объекта для использования в методе. Память, принадлежащая этому объекту, автоматически освобождается после того, как метод возвращается и объект теряет область видимости? Или я буду занимать все больше памяти при каждом вызове метода?

Код имеет такую ​​структуру:

int Class::method(int input) {
    Other_Class local_instance;
    int i;

    i = local_instance.do_something();
    i *= input;

    return i;
}

Так будет ли освобождена память, принадлежащая local_instance, после возвращения из метода? Или у меня будет много случаев Other_Class засорения памяти?

Большое спасибо за ваше время и помощь!

Ответы [ 6 ]

3 голосов
/ 14 ноября 2011

Объект local_instance будет размещен в стеке и будет уничтожен (будет вызван его деструктор), когда метод вернется.

1 голос
/ 14 ноября 2011

В C ++, если объект не создается в куче, вся память автоматически освобождается.Например, Other_Class создается в стеке, а не в куче, поэтому Other_Class будет автоматически освобожден возвращаемой функцией.

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

Например, хотя ваш код в порядке, этот код создает утечку памяти:

int main ()
{
   Other_Class *memOnHeap = new Other_Class;
   return 0;
}

В приведенном выше коде gcc позволит его скомпилировать, однако вы создадите утечку памятиразмер объекта Other_Class, потому что вы выделили ему память на утечку, но не освободили вызовом delete.Проблема может быть легко решена путем вставки delete memOnHeap; прямо перед возвращением.

1 голос
/ 14 ноября 2011

Предполагая, что Other_Class :: ~ Other_Class () вежливо очищает любую память, которую Other_Class выделяет в куче.

1 голос
/ 14 ноября 2011

Для начала local_instance - это не объект класса Other_Class, а функция без аргументов, возвращающая Other_class. Это также известно как самый неприятный синтаксический анализ C ++.

РЕДАКТИРОВАТЬ: Код в вопросе был исправлен; оригинальная версия имела

Other_Class local_instance();

Но давайте предположим, что эта строка на самом деле читается

Other_Class local_instance; // no parentheses

Тогда да, этот объект будет автоматически освобожден в конце функции. Однако обратите внимание, что то же самое , а не верно для объектов, которые вы выделяете с помощью new, для этих объектов вы обязаны удалить их, когда они больше не нужны.

0 голосов
/ 14 ноября 2011

В дополнение ко всему вышесказанному, если конструктор для объекта local_instance создает объекты с использованием оператора new, на который указывает указатель Other_Class*.Тогда этот объект при уничтожении не будет автоматически освобождать память, выделенную для этих операций.т.е. надо думать и о детях!(думаю, авто указатели, удаление в деструкторе и т. д.).

0 голосов
/ 14 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...