Вызывает ли этот вид усечения строки в c утечки памяти? - PullRequest
2 голосов
/ 27 марта 2012

Будет ли эта утечка памяти?

char *str = "Hello/World";
char *pos = rindex(str, '/');
*pos = 0;

Ответы [ 3 ]

7 голосов
/ 27 марта 2012

Нет, но это вызовет неопределенное поведение при записи в строковый литерал.Строковые литералы не обязательно должны быть модифицируемыми в C.

3 голосов
/ 27 марта 2012

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

Иллюстрируя первый пункт, давайте фактически выделим немного памяти динамически:

char *str = strdup("Hello/World"); // Allocates a block of memory and copies the string into it
char *pos = rindex(str, '/');      // Finds the slash
*pos = 0;                          // Terminates the string
free(str);                         // Releases the block

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

0 голосов
/ 27 марта 2012

Нет, так как только динамически выделенная память может просочиться (например, с помощью malloc и др.).

...