char **add_string(char **existing, const char *string){
size_t size = 0;
while (NULL != existing[size])
{
++size;
}
char **arr = realloc(existing, (size + 2) * sizeof *arr);
arr[size] = malloc(strlen(string) + 1);
strcpy(arr[size], string);
arr[size+1] = '\0';
return arr;
}
void free_strings(char **strings)
{
size_t size = 0;
while (NULL != strings[size])
{
free(strings[size]);
++size;
}
}
Я имею утечку памяти в строкеутечка памяти с массивами строк в C
char **arr = realloc(existing, (size + 2) * sizeof *arr);
Я думал, что существующая память предполагают, чтобы быть free'd при использовании перераспределить? Как исправить эту утечку памяти?
Редактировать: добавлена функция free_string и основная функция, которую я использую для запуска программы.
Где код, который освобождает массив позже? Инструмент проверки утечки может указывать на место утечки памяти, которое было выделено, но оно не может показать вам, где оно должно быть освобождено ... что, скорее всего, отсутствует. При условии, что 'realloc()' преуспел, он либо предоставит вам тот же блок, либо освободит старый, и выделит новый ... но вам все равно придется освобождать новый (или повторно) один в какой-то момент позже. – Dmitri
Почему вы делаете (размер + 2) вместо (размер + 1)? – odin
@ в том, как он получает размер, не включает конечный указатель NULL ... поэтому он должен добавить 2, 1 для NULL и 1 для новой строки. Хотя он должен установить последний указатель на 'NULL' вместо' '\ 0'' – Dmitri