您的位置:首页 > 其它

在对结构体分配的内存进行free时出现,关于 Windows 已在 **.exe 中触发一个断点。其原因可能是堆被损坏.

2016-03-04 21:16 417 查看
对于结构体嵌套的结构在用完后free释放时,可能会出现的" Windows 已在 **.exe 中触发一个断点。其原因可能是堆被损坏"问题,

如:

typedef struct{

int k;

int data[100];

}obsd_t;

typedef struct{

int m;

obsd_t  *obs;

}raw_t;

typedef struct{

int n;

raw_t raw

}strfile_t;

可以看出结果提strfile_t中包含结构体raw_t。

由于需要,在同一函数中,定义了结构体raw_t和strfilr_t指正:

raw_t *rawww;

strfile *str;

为对他们分配内存初始化以及释放内存定义函数 init_raw(raw_t *raw);

init_strfile(strfile_t *str);

free_raw(raw_t *raw);

free_strfile(strfile_t *str);

这是问题出现了,在同一个函数,定义两个指针

aw_t *raw;

strfile *str;

并将它们分配内存初始化后,再函数中使用,使用完后将两个结构体指针内存释放并置NULL时:

if(raw!=NULL)

{

free_raw(raw);

raw = NULL;

}

if(str!=NULL)

{

free_strfile(strfile_t *str);

str = NULL;

}
在执行到free_strfile(strfile_t *str);时报错Windows 已在 **.exe 中触发一个断点。其原因可能是堆被损坏;

首先我得数组没有越界访问,malloc 和free时也是成对出现的,.dll使用的是MDd时没有BUG的,但为什么会出现这个问题呢?

当时遇到这个错误时,查了网上很多解决方案,没能解决,几乎快要崩溃了

后来自己探索,猜测,最后终于发现问题原因并解决了:

原因:

我在使用过程中将函数中raw变量的地址传给了str变量里的成员raw

str->raw = *raw

两者使用的是一个地址,

在释放内存时:

调用free_raw(raw);已经将变量的内存释放掉了;

而在调用 free_strfile(str);时会再次释放成员变量raw内存;

而函数中raw变量的地址传给了str变量里的成员,两者共用的是同一段内存,因此相当于对变量raw的内存free了两次,必然会出现提示的

错误。

解决方案:1,函数中只用最外面的结构体指针strfile *str,在用到raw时用str->raw代替raw;

解决方案:2, 只调用free_strfile()函数,该函数自然释放掉其成员raw,(传给str成员raw的地址是函数raw传给它的,如:str->raw = *raw;)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息