Нужно ли освобождать строку, созданную с помощью 'strcpy'? - PullRequest
8 голосов
/ 21 февраля 2011

Нужно ли освобождать строку, созданную с помощью ' strcpy '? И как его освободить?

Редактировать: место назначения распределяется следующим образом:

char* buffer[LEN];

Ответы [ 5 ]

18 голосов
/ 21 февраля 2011

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

Конечно, если что-то else выделило памятьтогда да, эта память должна быть в конце концов освобождена, но она не имеет ничего отношения к strcpy.

Это предыдущее утверждение выглядит так, поскольку ваше определение является массивомсимволов указатели , а не массив символов:

char* buffer[LEN];

, и это будет почти , безусловно, будет сделано с:

buffer[n] = malloc (length);

ЭтоХорошая идея - начать думать с точки зрения ответственности за память, размещенную в malloc.Под этим я подразумеваю, что передача блока памяти malloc может также включать передачу ответственности за ее освобождение в какой-то момент.

Вам просто нужно выяснить (или решить, является ли это ваш код) ответственность зауправление памятью идет вместе с самой памятью.С strcpy, даже если вы передаете в блоке, уже выделенном malloc, место назначения, ответственность передается , а не , поэтому вам все равно придется самостоятельно освобождать эту память.Это позволяет вам легко передавать в malloc'е или non-malloc'е буфер, не беспокоясь об этом.

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

6 голосов
/ 21 февраля 2011

Если вы используете

char buffer[6];
strcpy(buffer, "hello");

например, тогда буфер освобождается, когда достигнут конец его области действия.

С другой стороны,

char *buffer;
buffer = malloc(sizeof(char) * 6);
strcpy(buffer, "hello");

таким образом вам нужно освободить выделенную память.

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

5 голосов
/ 21 февраля 2011

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

Например, если вы выделили буфериспользуя malloc, тогда да, вам нужно будет освободить его.Если вы разместили буфер в стеке, то нет, вы не будете, он будет освобожден автоматически, когда выйдет из области видимости.

2 голосов
/ 21 февраля 2011

Функция strcpy копирует строку в буфер, который необходимо получить другим способом (например, malloc);Вы должны освободить этот буфер, используя любой механизм, правильный для того, как вы его распределили.

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

strcpy() не создает строку, она только копирует строку.Выделение памяти полностью отделено от этого процесса.

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

...