Ваш сегмент кода:
char *s = "abc";
s = "def";
не приведет к утечке памяти. char *s
- указатель в памяти. Когда вы используете char *s = "abc"
, вы устанавливаете строковый литерал, на который может указывать *s
. Когда вы установите s
в строковый литерал "def"
, все, что вы делаете, меняется там, где *s
указывает.
Примечание: Вы можете сделать это только с указателями и не массивов. Если вы хотите использовать массивы вместо этого, вам может потребоваться использовать strcpy(3)
/strncpy(3)
.
Поскольку вы не указали ни одного указателя, либо с malloc(3)
/strdup(3)
, трудно получить утечку памяти.
Однако, вот пример утечки памяти:
const char *str1 = "abc";
const char *str2 = "def";
char *s1 = malloc(strlen(str1)+1); /* dynamic memory allocation with malloc() */
char *s2 = malloc(strlen(str2)+1);
s1 = s2;
Здесь вы устанавливаете s1
в s2
.Следовательно, это означает, что ячейка памяти s1
больше не существует, так как s1
указывает на s2
, а не на исходную ячейку памяти, на которую она была выделена. Вы больше не можете обрабатывать этот указатель, используя free(3)
, так как они больше не являются ссылкой на его местоположение. Если вы никогда не указали free()
указатель на кучу, это также вызовет утечку памяти.
Это не утечка памяти в традиционном смысле - это не ошибка. Но у вас будет буквальный «abc», который бесполезно сидит в вашей программе, добавив еще 4 байта в размер программы (о нет!). Скорее всего, оптимизирующий компилятор избавится от него. – Lundin