gpt4 book ai didi

c - 释放内存时程序卡住

转载 作者:太空宇宙 更新时间:2023-11-04 02:54:45 25 4
gpt4 key购买 nike

我有一个程序具有释放结构内存的功能。它通常工作正常,但有时会死机。

这是我试图释放内存的结构:

struct Image {
unsigned int height;
unsigned int width;
unsigned int maxvalue;
unsigned int *imgdata[];
};

这是释放内存的函数(printfs 只是在那里检查它卡住的地方)

void    Image_Delete (Image *img)
{
printf("1");
free(img->imgdata);
printf("1");
free(img);
printf("1");
}

有时这工作正常,但程序经常在 free(img); 时卡住。我的 Image_Delete 函数有任何错误吗?

这是我的 img 和 img->imgdata 的 malloc 行

Image *img= (Image*)malloc(sizeof(Image*));
img->imgdata[height*width]= (unsigned int*)malloc(height*width*sizeof(unsigned int*));

最佳答案

您的第一个 malloc 没有分配足够的空间:

Image *img= (Image*)malloc(sizeof(Image*));

这为“指向图像的指针”分配了足够的空间,但您将把它用作“图像”,它是 3 个整数和一个指针。因此,当您开始修改新分配的“图像”时,您最终会覆盖任意内存。此外,您的 free(img->imgdata) 调用使用的指针不包含在 img 的分配空间中,因此可能已被其他部分修改你的程序;对 malloc 未返回的值调用 free 可能会导致 malloc 的内部状态任意损坏,所以一切皆有可能。

这是一个提示。最好的风格是总是这样写你的 mallocs:

Image *img = malloc(sizeof *img);

使用 *variable 而不是重复类型更不容易出错,尽管您最终还是要重复变量名,所以它并不完美。而且没有必要强制转换 malloc 返回的 void*。

此外,回答您在评论中提出的问题:在 NULL 上调用 free 总是安全的,否则您只能在一个指针上调用它由 malloc 返回。所以如果你不打算马上填写img->imgdata,你应该把它清0。实际上,使用calloc而不是malloc 会更好;对于像 Image 这样的小对象,开销可以忽略不计。

关于c - 释放内存时程序卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18950605/

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