c-释放包含结构的内存区域



我正在处理结构和指针。考虑到以下代码:,我对free的工作原理有疑问

struct point{
int id;
double* values;
};
int main(int argc, char **argv) {
struct point *dataset = malloc(10 * sizeof(struct point));
....
free(dataset + 7);
}

free将只释放dataset + 7dataset + 8之间的sizeof(struct point),还是将从dataset + 7释放所有?

关于realloc,做这样的事情:

struct point{
int id;
double* values;
};
int main(int argc, char **argv) {
struct point *dataset = malloc(10 * sizeof(struct point));
....
free(dataset + 9);
dataset = realloc(dataset, 9 * sizeof(struct point));
}

这种做法错了吗?如果我从dataset中删除dataset[9]中的点,我必须先删除free,然后再删除realloc?还是只需要realloc

这是错误的。您无法重新分配freeED内存。如果realloc失败,您还需要保存返回的指向临时变量的指针,以避免内存泄漏。

int main(int argc, char **argv) {
struct point *dataset = malloc(10 * sizeof(*dataset));
struct point *tmp;
tmp = realloc(dataset, 9 * sizeof(*dataset));
if(tmp)
{
dataset = tmp;
}
else
{
/* handle allocation errors*/
}
/* .... */

//when dataset is not needed anymore
free(dataset);
}

注意:最好在sizeof中使用对象,而不是类型(如我的示例)。还应始终检查内存分配的结果,因为它可能会失败。

最新更新