Это считается утечкой памяти? - PullRequest
5 голосов
/ 26 августа 2010

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

Вот мое сомнение:

int main()
    {
      myclass x;

      ...

      throw;

      ...
    }

Если throw не обрабатывается, он вызывает метод terminate (), который, в свою очередь, вызывает abort ()и вылетает приложение.В настоящее время объекты в стеке не уничтожаются (деструктор не вызывается).

В моем понимании: «Когда приложение завершает работу (либо при прерывании, либо при обычном выходе), оно освобождает всю память,был выделен для приложения ".Таким образом, это не может рассматриваться как утечка памяти.

Я прав?

Ответы [ 7 ]

5 голосов
/ 26 августа 2010

В размещенной среде (например, в вашей обычной Unix / Windows / Mac OS X, даже DOS, машине), когда приложение завершает всю занятую память, она автоматически возвращается операционной системой.Поэтому беспокоиться о таких утечках памяти не имеет смысла.

В некоторых случаях перед завершением работы приложения может потребоваться освободить всю выделенную динамическую память, чтобы обнаружить потенциальные утечки памяти черездетектор утечки, как valgrind .Однако даже в таком случае описанный вами пример не будет считаться утечкой памяти.

В общем случае отказ от вызова деструктора - это не то же самое, что утечка памяти.Утечки памяти происходят из памяти, выделенной в куче (с новыми или malloc или распределителями контейнера).Память, выделенная в стеке, автоматически восстанавливается при размотке стека.Однако, если объект содержит какой-либо другой ресурс (например, файл или дескриптор окна), отказ от вызова его деструктора вызовет утечку ресурса, что также может быть проблемой.Опять же, современные ОС вернут свои ресурсы после завершения работы приложения.

4 голосов
/ 26 августа 2010

edit: как упоминалось GMan, "throw;" перебрасывает ранее выброшенное исключение или, если его нет, немедленно завершается. Поскольку в этом случае их нет, результатом является немедленное завершение.

Завершение процесса всегда очищает любую оставшуюся пользовательскую память в любой современной ОС, поэтому обычно не считается «утечкой памяти», которая определяется как не связанная с памятью память, не выделяемая в работающем процессе. Тем не менее, операционная система решает, считать ли это «утечкой памяти».

2 голосов
/ 26 августа 2010

Ответ, это зависит от ОС. Я не могу думать о современной ОС, которая не делает это таким образом. Но старые системы (я думаю, чтобы выиграть 3.1 в Windows, и некоторые старые встраиваемые платформы Linux), если программа закрылась, не освобождая свои запросы памяти, ОС удерживала их до тех пор, пока вы не перезагрузили.

1 голос
/ 26 августа 2010

От ОП,

Если бросок не обработан, он вызывает, terminate (), который в свою очередь вызывает abort () и вылетает приложение. В это время объекты в стеке не уничтожены (деструктор не вызывается).

Это поведение, определяемое реализацией.

$ 15,3 / 9- "Если нет подходящего обработчика нашел в программе функцию вызывается terminate (); так или иначе стек разматывается перед этим вызовом прекратить () определяется реализацией (15.5.1). "

Поэтому, полагаю, является ли это утечкой памяти или нет, это также поведение, определяемое реализацией

1 голос
/ 26 августа 2010

Реальный вопрос: «Распределяет ли myclass саму память, которая должна быть свободна / удалена?»

Если это не так - если единственная память, которую он использует, это ее внутренние члены - тогда она полностью существует в стеке. Как только он покидает эту функцию (как бы то ни было), память в стеке освобождается и используется повторно. myclass ушел. Так работают стеки.

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

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

1 голос
/ 26 августа 2010

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

0 голосов
/ 26 августа 2010

Насколько я понимаю, «когда приложение завершает работу (прерывается или при обычном выходе), оно освобождает всю память, выделенную для приложения».Таким образом, это не может рассматриваться как утечка памяти.

Я прав?

Утечка памяти - это тип ошибки программирования, который оценивается несколько ниже по шкале ошибок программирования - по сравнению сuncaught исключения.

IOW, если программа не завершается должным образом, иначе происходит сбой, тогда слишком рано говорить о утечках памяти.За прошедшее десятилетие в этом случае не возникало никаких тревог утечки памяти - потому что они не вызывали никаких тревог, когда программа тупо зависала.Сначала нужно заставить программу не падать, только потом отлаживать утечки памяти.

...