C语言 从数据结构中释放内存



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

我的结构:

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字节大的新内存块,并复制指针指向datasize字节的数据。

例:

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

相关内容

  • 没有找到相关文章

最新更新