Утечка памяти в следующем коде C - PullRequest
0 голосов
/ 11 сентября 2011

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

struct object_one{
  int value;
}*object,object_node;

struct node_one {
  void **pointers;

}*node, node_node;

  node sample(){
  object number;
  node node123;
  node123 = malloc(sizeof(node_node));
  number = malloc(sizeof(object_node));
  number->valu = malloc(sizeof(int));
  number->value = 9;
  node123->pointers[0]=number; 
  free(number);
  return node123; 
}

Правильно ли я делаю способ освободить память, на которую ссылается number. Как только я сделаю вышеуказанное, я получу ошибку;

Invalid read of size 4
==15957==    at 0x403804: main (abc.c:1255)
==15957==  Address 0x540cb50 is 0 bytes inside a block of size 4 free'd

Подскажите, пожалуйста, как я могу предотвратить утечку памяти в этом состоянии? Заранее спасибо.

[EDIT] * * +1010

Привет, на самом деле вышеупомянутое не настоящий код, который у меня есть. Но я старался изо всех сил ссылаться на sturcutre и семантику моего кода. На самом деле я реализую структуру данных. number - это временное хранилище, а node123 - моя настоящая база данных. Я хотел бы присвоить значение number в базе данных и разыменовать его. Тип number является компонентом базы данных.

[EDIT2]

Код, соответствующий строке 1255, печатает значение, которое хранится в object i'e value. Это выглядит так:

   object tempObject;
   tempObject = search_object(root,50);
   [1255] printf("Key is %d ------>value is %d\n",50,tempObject->value);

Здесь функция search_object ищет значение, соответствующее клавише 50. Функция возвращает правильное значение, связанное с клавишей, и все еще показывает такую ​​ошибку.

Ответы [ 3 ]

5 голосов
/ 11 сентября 2011

Вам также необходимо free(node123).

Но это не то, о чем говорит сообщение об ошибке.

Вы также разыменовываете указатель, который не 't указывает на допустимую память (в строке node123->pointers[0] = number). Вы не выделили никакой памяти для pointers, на которую можно указать, поэтому разыменование такой записи приведет к записи в случайную область памяти.

2 голосов
/ 11 сентября 2011

Вы забыли освободить (node123), кажется.

Для каждого вызова malloc () у вас должен быть вызов free ().

Ошибка valgrind, которую вы показываете, не утечка памяти, это недопустимое чтение в области памяти, которая была свободна.

Это происходит в abc.c в строке 1255.

1 голос
/ 11 сентября 2011

Вы забыли свободный (node123);

А также эту строку: node123-> pointers [0] = number;проблема.

Вы не инициализировали указатели внутри node123.

...