我有一个包含大小和一些数据的数据结构。我想在分配内存时释放内存。
我的结构:
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);
}
这当然是错误的。您是否保存了对数据的引用,根本不需要第二个 malloc。
如果要保存数据本身,则需要分配data
大小的缓冲区,然后将data
复制到分配的buff。
您现在拥有的版本只会泄漏内存。您不必为指针分配内存,只需为实际数据分配内存
new_data->data = malloc(sizeof(*data));
new_data->data = data;
首先分配内存,然后松散指针(内存泄漏(并用数据指针值覆盖指针值。第二行复制指针值,而不是指针后面的字节。为此,memcpy
.您可能希望:
new_data->data = malloc(size);
memcpy(new_data->data, data, size);
这将分配size
字节大的新内存块,并复制指针指向data
的size
字节的数据。
例:
#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);
}