Освободить память из структуры данных - PullRequest
0 голосов
/ 06 октября 2018

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

Моя структура:

struct test_t {
    int size; 
    void *data;   
};

Чтобы создать свою структуру, я выделяю test->data, а затем выделяю struct test_t.Как показано:

struct teest_t *data_create(int size, void *data){
  if (size <= 0 || data == NULL) return NULL;

  struct test_t *new_data = malloc( sizeof(struct test_t));

  new_data->size = size;

  new_data->data = malloc(sizeof(*data));
  new_data->data = data;

  return new_data;
}

Теперь, когда я хочу освободить свою память, это вызывает Segmentation fault (core dumped).Это моя функция:

void data_destroy(struct test_t *data){

  if (data->data == NULL) free(data->data);
  free(data);
}

Ответы [ 2 ]

0 голосов
/ 06 октября 2018
new_data->data = malloc(sizeof(*data));
new_data->data = data;

Сначала вы выделяете память, затем теряете указатель (утечка памяти) и перезаписываете значение указателя значением указателя данных.Вторая строка копирует значение указателя, а не байты за указателями.Для этого используйте memcpy.

Возможно, вы захотите:

new_data->data = malloc(size);
memcpy(new_data->data, data, size);

Это позволит выделить новый блок памяти размером size байтов и скопировать size байтов данных, на которые указывает data указатель.

Пример:

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

struct test_t {
    size_t size; 
    void *data;   
};

struct test_t *data_create(size_t size, void *data){
  if (size <= 0 || data == NULL) return NULL;

  struct test_t *new_data = malloc(sizeof(struct test_t));
  if (new_data == NULL) {
     goto NEW_DATA_MALLOC_ERR;
  }

  new_data->size = size;
  new_data->data = malloc(size);
  if (new_data->data == NULL) {
      goto NEW_DATA_DATA_MALLOC_ERR;
  }
  memcpy(new_data->data, data, size);

  return new_data;

NEW_DATA_DATA_MALLOC_ERR:
  free(new_data);
NEW_DATA_MALLOC_ERR:
  return NULL;
}

void data_destroy(struct test_t *data) {

  if (data->data == NULL) {
      free(data->data);
  }
  free(data);
}

int main() {
    int object = 1;
    struct test_s *A = data_create(sizeof(object), &object);
    data_destroy(A);
}
0 голосов
/ 06 октября 2018

Это неправильно, конечно.Если вы сохраняете ссылку на данные, второй malloc вообще не нужен.

Если вы хотите сохранить сами данные, вам нужно выделить буфер размером data, а затем скопировать data до выделенного баффа.

У имеющейся у вас версии только утечка памяти.Вам не нужно выделять память для указателя, только для собственно данных

...