从数据结构释放内存

时间:2018-10-06 00:22:07

标签: c memory struct malloc free

我有一个包含大小和一些数据的数据结构。我想在分配内存时释放它。

我的结构:

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 :(得分:4)

这当然是错误的。您是否保存了对数据的引用,根本不需要第二个malloc。

如果要保存数据本身,则需要分配data大小的缓冲区,然后将data复制到分配的buff。

您现在拥有的版本只会泄漏内存。您不必为指针分配内存,只需为实际数据分配

答案 1 :(得分:1)

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);
}