Являются утечки памяти “неопределенным поведением” проблема класса в C++?

Оказывается, что многими невинно смотрящими вещами является неопределенное поведение в C++. Например, после того как ненулевой указатель был delete'd даже распечатывающий то значение указателя неопределенное поведение.

Теперь утечки памяти определенно плохи. Но какая ситуация с классом - они - определенный, неопределенный или что другой класс поведения?

14
задан Community 23 May 2017 в 12:24
поделиться

9 ответов

Утечка памяти.

Неопределённого поведения нет. Утечка памяти совершенно легальна.

Неопределённое поведение: это действия, которые стандарт специально не хочет определять и оставляет до реализации, чтобы было гибко выполнять определённые типы оптимизаций без нарушения стандарта.

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

Конечно, если вы продолжите утечку, то в конце концов у вас закончится доступная память, и приложение начнет выбрасывать исключения bad_alloc. Но это уже другая проблема.

28
ответ дан 1 December 2019 в 05:59
поделиться

Неопределенное поведение означает, что то, что произойдет, не определено или неизвестно. Поведение утечки памяти определенно известно в языке Си/Си++, чтобы съесть имеющуюся память. Однако возникшие проблемы не всегда могут быть определены и варьироваться так, как это описывается в gameover

.
-1
ответ дан 1 December 2019 в 05:59
поделиться

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

Конечно, утечка памяти может привести к неопределенному поведению позже.

.
0
ответ дан 1 December 2019 в 05:59
поделиться

Прямой ответ: Стандарт не определяет, что происходит при утечке памяти, поэтому он является "неопределенным". Однако, он неявно неопределён, что менее интересно, чем явно неопределённые вещи в стандарте.

.
0
ответ дан 1 December 2019 в 05:59
поделиться

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

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

Возможно, неопределенное поведение, но на самом деле и то, и другое.

.
1
ответ дан 1 December 2019 в 05:59
поделиться

Его поведение определенно определено.

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

2
ответ дан 1 December 2019 в 05:59
поделиться

В спецификации языка ничего не сказано об "утечках памяти". С точки зрения языка, когда вы создаёте объект в динамической памяти, вы делаете именно это: вы создаёте анонимный объект с неограниченным временем жизни/хранения. "Неограниченное" в данном случае означает, что объект может закончить своё время жизни/продолжительность хранения только при явном обращении к нему, но в противном случае он продолжает жить вечно (до тех пор, пока программа выполняется).

Теперь мы обычно считаем, что динамически выделяемый объект становится "утечкой памяти" в момент выполнения программы, когда все ссылки (общие "ссылки", например, указатели) к этому объекту теряются до невосстановимости. Обратите внимание, что даже для человека понятие "все ссылки теряются" не очень точно определено. Что, если у нас есть ссылка на какую-то часть объекта, которая теоретически может быть "пересчитана" на ссылку на весь объект? Это утечка памяти или нет? Что, если мы вообще не имеем ссылок на объект, но каким-то образом можем вычислить такую ссылку, используя некоторую другую информацию, доступную программе (например, точную последовательность распределений)?

Спецификация языка не касается подобных вопросов. Что бы вы ни считали появлением "утечки памяти" в вашей программе, с точки зрения языка это вообще не является событием. С языковой точки зрения "утечка" динамически выделяемого объекта просто продолжает жить счастливо до тех пор, пока программа не завершит свою работу. Это единственная оставшаяся проблема: что произойдет, когда программа закончится и некоторая динамическая память все равно будет выделена?

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

.
3
ответ дан 1 December 2019 в 05:59
поделиться

При утечке памяти выполнение продолжается так, как будто ничего не происходит. Это определенное поведение. Вниз по дорожке, вы можете обнаружить , что вызов malloc не работает из-за нехватки доступной памяти. Но это определенное поведение malloc, и последствия этого также четко определены: вызов malloc возвращает NULL.

Теперь это может привести к тому, что программа, которая не проверяет результат работы malloc, выйдет из строя с нарушением сегментации. Но такое неопределенное поведение (из POV спецификации языка) связано с разыменованием программой некорректного указателя, а не с утечкой памяти ранее или неудачным вызовом malloc.

6
ответ дан 1 December 2019 в 05:59
поделиться

Утечка памяти определенно определяется на языке С/С++.

Если я это сделаю:

int *a = new int[10];

за которым последует

a = new int[10]; 

Я определенно утечка памяти, так как нет возможности доступа к 1-му выделенному массиву, и эта память не освобождается автоматически, так как GC не поддерживается.

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

.
6
ответ дан 1 December 2019 в 05:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: