在对结构体分配的内存进行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;)
如:
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;)
相关文章推荐
- 如何重装TCP/IP协议
- Windows 8 官方高清壁纸欣赏与下载
- 谁是桌面王者?Win PK Linux三大镇山之宝
- 对《大家都在点赞 Windows Terminal,我决定给你泼一盆冷水》一文的商榷
- Windows Clang开发环境备忘
- 从Windows系统下访问Linux分区相关软件
- 对《大家都在点赞 Windows Terminal,我决定给你泼一盆冷水》一文的商榷
- Windows下搭建本地SVN服务器
- 利用开源软件打造自己的全功能远程工具
- Visual Studio 2012 示例代码浏览器 - 数以千计的开发示例近在手边,唾手可得
- Visual Studio 2012 示例代码浏览器 - 数以千计的开发示例近在手边,唾手可得
- 微软镜像下载
- windows server域用户提升到本地更高权限组中的方法
- 使用命令修改注册表键值及权限
- 通过手机、电脑远程开关机,Windows和linux机手机,电脑相互控制
- Windows XP最新应用技巧大荟萃
- Windows 系统组策略应用全攻略(上)第1/2页