когда освободится память? - PullRequest
6 голосов
/ 04 октября 2011

Я создал блок кода, как это.

proc()
{
    Z* z = new Z();
}

теперь указатель, объявленный внутри метода proc, будет иметь область видимости только до proc. Я хочу спросить, когда DTOR для z будет вызываться автоматически. когда элементы управления выходят из метода proc или когда мое приложение закрыто.

Ответы [ 7 ]

17 голосов
/ 04 октября 2011

Деструктор не будет вызываться вообще. Память, используемая *z, будет вытекать до тех пор, пока приложение не будет закрыто (после чего операционная система освободит всю память, используемую вашим процессом).

Чтобы избежать утечки, вам нужно позвонить delete в какой-то момент или, что еще лучше, использовать умные указатели.

12 голосов
/ 04 октября 2011

Это утечка памяти. Что вы, вероятно, должны иметь это:

void
proc()
{
    Z z;
}

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

Если по какой-то причине вам нужно динамическое распределение (например, из-за полиморфизм), то вы должны использовать какой-то умный указатель; std::auto_ptr хорошо работает здесь, и такие вещи, как scoped_ptr, если вы иметь их, может быть, даже лучше.

7 голосов
/ 04 октября 2011

Это одна из основ C ++.

Динамическое выделение

В вашем случае выделение памяти и последующий вызов конструктора для Z произойдет в new:

Z* z = new Z();

Противоположная часть для уничтожения и освобождения памяти произойдет в delete:

delete z;

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

Объявление

С другой стороны, если вы объявляете объект следующим образом:

Z z;

Выделение памяти и конструктор будут вызываться немедленно прямо здесь, в точке объявления, и когда закончится область существования объекта (т.е. в конце функции), деструктор будет вызван автоматически, и память будет освобождена.

Динамическое распределение против декларации

Я не буду вдаваться в споры о том, что лучше, а что нет, а скорее приведу выдержку изодна из статей, на которую ссылаются ниже:

В отличие от объявлений, которые загружают данные в сегмент данных программ, динамическое выделение создает новое полезное пространство в программах STACK (область ОЗУ, специально выделенная для этой программы).).

К вашему сведению: Стек = Производительность , но не всегда лучшее решение .

Ссылки

Для вашего удовольствия: Tic TAC Toe .

4 голосов
/ 04 октября 2011

У вас будет утечка памяти, если вы не передадите z в delete.

1 голос
/ 04 октября 2011

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

1 голос
/ 04 октября 2011

Деструктор Z не будет вызван, если вы не введете в коде строку, подобную этой:

delete z;
1 голос
/ 04 октября 2011

DTOR не будет вызываться автоматически. Вы должны использовать ключевое слово "delete".

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