Должен ли этот указатель C быть освобожден? - PullRequest
4 голосов
/ 20 мая 2010

Прошу прощения за мою новизну С.

Рассмотрим следующую процедуру C:

int doSomething() {
    char *numbers="123456";
    ...
}

Перед выходом из этой процедуры я должен отпустить указатель 'numbers'?

Ответы [ 7 ]

9 голосов
/ 20 мая 2010

Нет, вы не malloc это. Почему вы должны выпустить это?

Часто строка помещается в секцию только для чтения исполняемого файла.

4 голосов
/ 20 мая 2010

На языке Си вы не можете и не можете «выпускать» указатели. Указатели - это обычные скалярные переменные. Вы ничего не можете с ними сделать с точки зрения «освобождения» или чего-то подобного.

То, что можно «освободить», это память, на которую указывает указатель . Но в C вам нужно только освободить память, которая была явно выделена на malloc / calloc / realloc. Такая память освобождается путем вызова free.

Обратите внимание, что в вашей программе может быть несколько (сто) указателей, указывающих на один и тот же блок выделенной памяти. В конце концов вам придется освободить этот блок памяти. Но независимо от того, сколько указателей вы указали на этот блок, вы должны освободить этот блок памяти ровно один раз. Вы несете ответственность за то, чтобы выпустить его. И вы обязаны убедиться, что вы выпустили его ровно один раз. Я говорю вам это только для иллюстрации того, что вы выпускаете блок памяти 1016 *, а не указатели.

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

3 голосов
/ 20 мая 2010

Нет, в этом нет необходимости, и это неправильно (спасибо dmckee). Строка символов будет находиться в сегменте данных двоичного файла, поэтому ее нельзя освободить. Память не была выделена динамически.

"числа" будут в стеке, поэтому они исчезнут, когда функция вернется.

2 голосов
/ 20 мая 2010

вам на самом деле не нужно вызывать delete или free, эти операторы используются только для очистки памяти, которая была выделена моему распределителю памяти времени выполнения, например malloc, calloc, GlobalAlloC, HeapAlloc и так далее.Когда вы определяете указатель, как в примере, вы фактически выделяете пространство для массива символов в исполняемом файле.чем больше длина строки, тем больше будет размер исполняемого файла, тем самым увеличивая ваш рабочий набор.

1 голос
/ 20 мая 2010

Нет;Там нет ничего, чтобы выпустить.Строковый литерал "123456" является массивом char (const char в C ++) со статическим экстентом.Память для него выделяется при запуске программы и удерживается до выхода из программы.Все, что вы сделали, это присвоили адрес строкового литерала numbers;вы на самом деле не выделяли память.

0 голосов
/ 20 мая 2010

НЕТ, поскольку он не был выделен командой malloc / calloc / realloc.

Он будет автоматически "освобожден", потому что это автоматическая переменная.

0 голосов
/ 20 мая 2010

Нет, это указывает на предварительно выделенную память в сегменте данных процесса. Только free(3), что у вас есть malloc(2) -ed (по модулю некоторых библиотечных функций, таких как getaddrinfo(3) / freeaddrinfo(3).)

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