Утечка памяти / Распределение памяти в C ++ - PullRequest
3 голосов
/ 30 ноября 2009

У меня есть следующая функция в C ++

void func1()
{
    char *p = "Test for memory leak";
}

Когда вызывается func1(), где выделяется память для переменной? Будь в стеке или в куче? Должен ли delete p; вызываться явно?

Ответы [ 8 ]

15 голосов
/ 30 ноября 2009

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

10 голосов
/ 30 ноября 2009

Нет, память выделяется только для указателя p в стеке. Эта память автоматически восстанавливается, когда p выходит из области видимости. p просто указывает на строку, которая хранится где-то в разделе только для чтения вашей программы. В идеале это должно быть определено как const char *p. Если вы попытаетесь delete, это будет неопределенное поведение. Как правило, вы можете помнить, что для каждого звонка на new должен быть звонок на delete

4 голосов
/ 30 ноября 2009

операторы new и new [] используются для явного выделения памяти в куче в C ++.

Правило
1. звоните delete для каждого new оператора
2. звоните delete[] для каждого оператора new[].

В остальном все идет в стек, и не следует явно освобождать его. Об этом автоматически позаботятся.

Следуйте этому правилу, и вы не ошибетесь.

Хотя, будьте осторожны, если вы используете new в цикле и используете delete вне его. Это вызывает большие утечки памяти.

Рекомендуется использовать интеллектуальные указатели, которые автоматически освобождают память, когда указатель выходит из области видимости. Библиотека Boost предлагает несколько хороших вариантов для того же. Подробнее об этом здесь: http://www.boost.org/doc/libs/1_41_0/libs/smart_ptr/smart_ptr.htm

- Самрат Патил

2 голосов
/ 26 ноября 2011

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

1 голос
/ 30 ноября 2009

Функция определяет указатель p, который указывает на статически размещенную строку "Test for memory leak".

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

Вы должны всегда связывать вызовы с new и delete. Когда что-то new ', это должно быть deleted, и наоборот.

В вашем случае сама строка является статической и длится до завершения программы. И p - это локальная переменная в стеке, и она длится до тех пор, пока не вернется функция.

Таким образом, оба они автоматически обрабатываются системой.

1 голос
/ 30 ноября 2009

Нет утечки памяти вообще. Если вы посмотрите на скомпилированный код, строка Test for memory leak\0 фактически является частью исполняемой программы - и загрузчик скопирует ее в память во время выполнения. Операционная система очищает эту предварительно загруженную память после завершения программы.

Сама переменная *p выделяется в стеке при вызове функции и когда функция возвращает указатель, удаляется из стека.

0 голосов
/ 30 ноября 2009

delete требуется для вызова памяти, выделенной с помощью new (только для памяти, полученной из кучи).

0 голосов
/ 30 ноября 2009

Строковые литералы обычно расположены в текстовом сегменте только для чтения вашего исполняемого файла. Вызов «бесплатный» / «удалить» для них, вероятно, приведет к плохим вещам.

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