C ++: не является ли удаление объекта / всегда / утечка памяти? - PullRequest
4 голосов
/ 24 июля 2011
class MyClass
{
    // empty class with no base class
};

int main()
{
    MyClass* myClass = new MyClass();

    return 0;
}

Это утечка памяти?

Ответы [ 3 ]

8 голосов
/ 24 июля 2011

Да. Даже если ваш класс пуст, вы все равно теряете память. Для этого есть несколько причин:

  • Распределение никогда не бывает нулевой длины. Ваша ОС не возвращает буфер с нулевыми байтами. Существует минимальный размер выделения, и этот размер вы получите, если выделите структуру с нулевым байтом. (На моей машине это 16 байтов.)
  • Даже если существуют выделения нулевой длины, объекты систематически имеют размер не менее 1 байта (где размер байта равен размеру char).
  • Даже если вы получили распределение нулевой длины, ваша ОС должна отслеживать это распределение. Для этого он использует еще несколько байтов для сопоставления адреса с деталями его выделения. Это имеет накладные расходы памяти постоянного размера, которые вы получаете каждый раз, когда выделяете память.

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

7 голосов
/ 24 июля 2011

У вас возникает утечка памяти каждый раз, когда:

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

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

В вашей программе-примере вы динамически выделяете объект MyClass и устанавливаете myClass в точкук этому.myClass является единственным указателем на динамически размещаемый объект.Затем вы возвращаетесь из функции и теряете указатель;на этом этапе динамически распределяемый объект MyClass протекает.

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

1 голос
/ 24 июля 2011

Обратите внимание, что все гарантированно будет иметь размер не менее байта C ++, который всегда равен размеру char.(Ваш пробег может варьироваться в экзотических системах, но обычно он составляет восемь бит. Проверьте с помощью CHAR_BIT.) Так что да, это займет память (хотя и очень мало) и , что память будетбыть утечкой.

Следовательно, не удаляя объект, действительно, всегда будет утечка памяти.

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