Что произойдет, если утечка памяти? - PullRequest
6 голосов
/ 16 февраля 2011

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

И как это повлияет на систему, в которой работает программа?

Ответы [ 5 ]

8 голосов
/ 16 февраля 2011

Когда ваш процесс распределяет память из ОС на постоянной основе и никогда не освобождает ее, вы в конечном итоге будете использовать больше памяти, чем физически в машине. В этот момент операционная система сначала переключается на виртуальную память (снижает производительность), если она есть, и в какой-то момент ваш процесс достигнет точки, когда ОС больше не сможет предоставлять ей больше памяти, поскольку вы превысили максимальный объем адресуемого пространства (4 ГБ в 32-битной ОС).

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

3 голосов
/ 16 февраля 2011

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

Например, в C это можно сделать с помощью простой последовательности:

void *pointer = malloc (2718); // Alloc, store address in pointer.
pointer = malloc (31415);      // And again.
free (pointer);                // Only frees the second block.

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

Эта последовательность сама по себе не является 'Это плохо (ну, это это плохо, но эффект может и не быть).Обычно, когда вы делаете это неоднократно, возникают проблемы.Например, в цикле или в функции, которая неоднократно вызывается:

static char firstDigit (int val) {
    char *buff = malloc (100);      // Allocates.
    if (val < 0)
        val = -val;
    sprintf (buff, "%d", val);
    return buff[0];                 // But never frees.
}

Каждый раз, когда вы вызываете эту функцию, вы теряете сто байт (плюс вся служебная информация).

ИДа, утечки памяти будут влиять на другие вещи.Но эффекты должны быть ограничены.

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

Однако приличная операционная система (включая Windows) ограничит ресурсы, которыеможно использовать один процесс, что минимизирует влияние на других процессов.Поскольку современные среды отключают виртуальную от физической памяти, единственный реальный эффект, который может быть перенесен из процесса в процесс, - это если все время пытаться сохранить всю его виртуальную память в физической памяти, уменьшая выделение этой физической памяти другим процессам.

Но даже если один процесс теряет гигабайты памяти, сама память не будет использоваться процессом (суть утечки в том, что процесс потерял доступ к памяти).И, поскольку он не используется, ОС почти наверняка выгрузит его на диск и никогда больше не вернет его в ОЗУ.

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

1 голос
/ 16 февраля 2011

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

Программа исчерпает ограниченные ресурсы на некоторой скорости. В зависимости от объема памяти и файла подкачки это может привести к тому, что программа в конечном итоге получит указание «невозможно выделить память», или операционной системе не хватит физической памяти и файла подкачки, и любая программа получит «невозможно выделить память» индикация. Последнее может иметь серьезные последствия для некоторых операционных систем - иногда мы видим, как Windows XP полностью разваливается, а критически важные службы работают со сбоями, когда чрезмерное потребление памяти в одной программе исчерпывает всю память. Если это произойдет, единственный способ решить эту проблему - перезагрузить систему.

1 голос
/ 16 февраля 2011

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

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

1 голос
/ 16 февраля 2011

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

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