Я пытаюсь построить функцию str_replace в C (чтобы узнать C). Для того, чтобы сделать вещи немного проще, я решил создать две вспомогательные функции, одна из которых имеет следующий прототип:Утечка памяти, работающая со строками C
char * str_shift_right(const char * string, char fill, int32_t n);
Он принимает строку и добавляет символ fill
на n
-й позиции в заданной строкой. Вот полный код:
// replace the nth char with 'fill' in 'string', 0-indexed
char * str_shift_right(const char * string, char fill, int32_t n) {
// +1 the null byte, +1 for the new char
int32_t new_size = (int32_t) strlen(string) + 2;
char * new_string = NULL;
new_string = calloc(new_size, sizeof(char));
new_string[new_size - 1] = '\0';
int32_t i = 0;
while (i < strlen(string) + 1) {
// insert replacement char if on the right position
if (i == n) {
new_string[i] = fill;
// if the replacement has been done, shift remaining chars to the right
} else if (i > n) {
new_string[i] = string[i - 1];
// this is the begining of the new string, same as the old one
} else {
new_string[i] = string[i];
}
i++;
}
return new_string;
}
Я хотел убедиться, эта функция не была утечка памяти, поэтому я попытался выполнив следующий код:
int main(int argc, const char * argv[])
{
do {
char * new_str = str_shift_right("Hello world !", 'x', 4);
printf("%s", new_str);
free(new_str);
} while (1);
return 0;
}
Однако при просмотре использования памяти с монитором активности (приложение Mac OSX для тех, кто не знаком, вроде диспетчера процессов в Windows), похоже, что RAM быстро съедается, и он не становится доступным, когда программа перестает выполняться.
Это утечка памяти? Если да, то что я сделал не так? Разве не вызов free(new_str)
освобождает память?
Благодарим за помощь.
Редактировать 1: Исправлено одной ошибкой, обнаруженной PaulR. Проблема остается.
Почему 'calloc', когда вы сразу написать по всем нулям так красиво инициализируются для вас? –
'new_string [new_size] = '\ 0';' является недопустимой записью - вы, вероятно, имели в виду 'new_string [new_size - 1] = '\ 0';'? –
Вы также можете использовать инструмент, например 'valgrind', чтобы проверить вашу программу на утечку памяти. – tomato