gpt4 book ai didi

c - 使用灵活的数组成员释放动态分配的结构

转载 作者:太空狗 更新时间:2023-10-29 15:59:02 25 4
gpt4 key购买 nike

我有一个定义如下的数据结构:

struct varr {
int n; //length of data array
double data[];
};

要求数据数组的初始大小为 1,但允许增加的可能性。

当为 struct varr * 分配空间时,我使用

struct varr *p = malloc(sizeof(struct varr) + sizeof(double));

重新分配空间以增加我使用的数据数组的大小时

p = realloc(p, sizeof(struct varr) + p->n * sizeof(double));//p->n having already been set

我的问题是“我应该如何释放为此结构分配的内存?”

我已经尝试了一个简单的 free(p); 但根据 memcheck,这会导致内存泄漏。我为此目的构建数据的方式或分配内存的方式是否存在根本性错误?

==注意==

我已经通过使用指针而不是显式声明的数组解决了这个问题。但是,我仍然对为什么这不起作用的简明答案感兴趣。

最佳答案

您可能知道,每次调用 malloc 都会让操作系统为您提供一些内存并记住它的大小和属性。因此,如果您调用 free,您可以清除数组或指针。

例子:

char* array = malloc(16 * sizeof(char));
char* single = malloc(sizeof(char));

free(array);
free(single);

如您所见,一个malloc 总能得到一个免费。那是因为操作系统知道你分配了多少字节,它不关心它是什么类型以及创建了多少个实例。 (注意:这就是 C++ 中 deletedelete[] 之间存在差异的原因,因为应用程序需要知道要运行哪些析构函数,清理的控制权不留给仅操作系统...)

从这里开始,我们可以假设如果我们使用单个 malloc 将结构分配为一个 block ,则可以使用单个 free 调用将其释放。

这个例子对我来说没有任何泄漏:

#include <stdlib.h>

typedef struct Array_t
{
int Length;
double Data[];
} Array;

Array* create_array(int length)
{
Array* array = malloc(sizeof(Array) + length * sizeof(double));
if (array != NULL)
array->Length = length;

return array;
}

void delete_array(Array* array)
{
free(array);
}

int main()
{
Array* array = create_array(100);
if (array == NULL)
return EXIT_FAILURE;

for (int i = 0; i < array->Length; ++i)
{
array->Data[i] = 1.7 * (i + 3);
}

delete_array(array);

return EXIT_SUCCESS;
}

当然,如果你开始做一些更复杂的事情,比如 John Findlay 的例子

struct SomeStruct
{
int Size;
int* ArrayOfPointers[];
}

你仍然可以在一个malloc中创建这个结构,例如

// *s* contains an array of 14 int pointers (int*)
struct SomeStruct* s = malloc(sizeof(SomeStruct) + 14 * sizeof(int*));
s->Size = 14;

核心问题是虽然 int* ArrayOfPointers 是一个指针数组,因此要正确初始化它,您还需要

// each of the *s*'s int pointers is actually a decayed array of 25 ints
for (int i = 0; i < s->Size; ++i)
s->ArrayOfPointers[i] = malloc(25 * sizeof(int));

释放时:

for (int i = 0; i < s->Size; ++i)
free(s->ArrayOfPointers[i]);

free(s);

但要点是,带有 FAM 的结构仍然在一次 free 调用中被释放。循环正在释放分配的指针数据,这相当于释放动态分配的二维数组。

关于c - 使用灵活的数组成员释放动态分配的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13391617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com