我有一个包含大小和一些数据的数据结构。我想在分配内存时释放它。
我的结构:
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);
}
答案 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);
}