Утечка памяти в Valgrind во время перераспределения - PullRequest
0 голосов
/ 24 сентября 2018

Я не уверен, почему Valgrind сообщает об утечке памяти на нем?

Псевдокод в файле .c:

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>

 char* str_alloc(char *str) {
   char* dup = (char*) malloc((strlen(str) + 1) * sizeof(char));
   strcpy((char*) dup, (char*) str);
   return dup;
 }

 void function_c(char **name) {
   int len = 10;
   (void) realloc(*name, 100);
 }

 void function_b(char **name) {
   (void) function_c(name);
 }

 void function_a(char **name) {
   (void) function_b(name);
 }

 int main() {
   char* name = str_alloc("");
   function_a(&name);
   // Do something with name
   free(name);
 }

Я игнорирую значение realloc, так как уверен, что realloc всегда будет на одном и том же указателе.Выделение / перераспределение из моего собственного пула памяти, который довольно огромен.

Конечно, я не могу написать код для пула памяти здесь.

Итак, в каких случаях я буду ожидать утечки Valgrind?Пара случаев, о которых я подумал:

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

Есть еще случаи?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Я игнорирую значение realloc, так как уверен, что realloc всегда будет на одном и том же указателе.Выделение / перераспределение из моего собственного пула памяти, который довольно большой.

В коде, использующем стандартный интерфейс malloc / realloc / free, вы просто не можете сделать это предположение, , даже если вы думаете, что предоставили реализацию и знаете, как она будет себя вестив контролируемых условиях.Будущие люди, работающие над вашим кодом (включая вас самих, спустя годы после того, как вы забыли подробности этого проекта), предположат, что нет ничего особенного в том, как ваш код использует стандартные интерфейсы, и они могут перенести код в совершенно иную реализацию C, не привносяваша специальная библиотека malloc.

Кроме того, библиотека C имеет право отказать вам в замене этих функций, что и вызывает вашу непосредственную проблему: valgrind принудительно заменяет свою собственную реализацию malloc / realloc / free на любыеу вас была реализация, которая никогда не возвращает один и тот же указатель из realloc.Это специально для того, чтобы отлавливать ошибки, подобные этой.

Если вы хотите реализовать пул памяти, который дает такие гарантии, как «изменение размера выделения не перемещает выделение», то вам нужно предоставить всефункционирует новые имена (например, pool_alloc, pool_resize, pool_free).

0 голосов
/ 24 сентября 2018

Утечка памяти из-за потери памяти, выделенной realloc.

Синтаксис для realloc выглядит следующим образом.

void *realloc(void *ptr, size_t size); 

Примечание. Не гарантируется, чтоуказатель, возвращаемый realloc, будет таким же, как и старый указатель, переданный realloc, и от него не следует зависеть.

Даже компилятор также предупреждает вас об этом.

предупреждение: игнорирование возвращаемого значения 'realloc', объявленного с атрибутом warn_unused_result [-Wunused-result]

(void) realloc(*name, 100);
^

Следовательно, вам нужно изменить функцию function_c какниже.

 void function_c(char **name) 
 {
     char *newPtr = NULL;
     newPtr  =  realloc(*name, 100);
     *name = newPtr;
 }
...