2017-02-14 12 views
4

У меня есть некоторые недоразумения по поводу этого простого примера:Делает ли символ символом * символом другой строки?

char *s = "abc"; 
s = "def"; 

Будет ли присвоение второй строки вызвать утечку памяти, или он будет заменен правильно? Если первое верно, как правильно заменить значение s?

+3

Это не утечка памяти в традиционном смысле - это не ошибка. Но у вас будет буквальный «abc», который бесполезно сидит в вашей программе, добавив еще 4 байта в размер программы (о нет!). Скорее всего, оптимизирующий компилятор избавится от него. – Lundin

ответ

6

№ Нет утечки памяти.

Вы просто изменили s, чтобы указать на другой строковый литерал, который хорош (с этим: s = "def";).

Проще говоря, если вы не выделили что-либо самостоятельно, используя malloc/calloc/realloc или любая функция, которая возвращает динамически выделенную память (и документация говорит вам free(). Например, getline() функция POSIX в делает это), вы дон Не нужно free().

+0

Я довольно уверен, что' getline() 'использует' realloc() ' для изменения размера буфера, если это необходимо, поэтому вам нужно будет использовать 'free()', особенно если он терпит неудачу. – RoadRunner

3

Обе строки определены статически, поэтому утечки памяти нет. Что бы просочиться бы:

char *s = strdup("abc"); // dynamic memory allocation 
s = "def"; 

На самом деле есть небольшая статическая трата памяти (не назвал бы, что утечка), так как вы не можете использовать "abc" больше.

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

Теперь, если у вас есть char s[] = "abc"; (массив, а не указатель), а "def" строка одинакового размера, вы можете сделать:

strcpy(s,"def"); 

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

+0

«Отходы памяти» Не могу понять, что это такое, опасно ли это? – user3003873

+1

Нет. У вас просто не используется память «abc». Не опасно просто бесполезно –

+1

Ваш код - утечка памяти - пространство, динамически выделяемое 'strdup', не было освобождено –

0

Ваш сегмент кода:

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() указатель на кучу, это также вызовет утечку памяти.