c++内存释放隐患问题求解

hawkmsg 2012-09-02 12:46:05
while ((node = *ref) != NULL) {
*ref = node->next;
free(node);
if (!unchain(ref)) {
break;
}
}
if(node != 0) {
free(node); //(double free valnerability)
return UNCHAIN_FAIL;
}
以上代码,对于二次回收带来的安全隐患是什么?请详细解释下,谢谢!
...全文
116 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kevin_Perkins 2012-09-02
  • 打赏
  • 举报
回复
不可预知。
yh_no_code 2012-09-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
while ((node = *ref) != NULL) {
*ref = node->next;
free(node);
if (!unchain(ref)) {
break;
}
}
if(node != 0) {
free(node); //(double free valnerability)
return UNCHAI……
[/Quote]

还是要写自己有把握的代码吧,这个是未知的。
whucv 2012-09-02
  • 打赏
  • 举报
回复
free之后,马上把node赋值为NULL,例如:
if(node != NULL)
{
free(node);
node = NULL;
}
startservice 2012-09-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

1、第一次free后,node所指向的内存已经被释放,而此时node指向仍是原处;
2、free之后,其它代码段就可以使用这段内存了,也就是说这段内存数据的变化已经不在掌控之中;
3、第二次free的时候,其结果不可预料,这是典型的野指针行为。
所以,最好的做法是free之后,马上把node赋值为NULL,例如:
if(node != NULL)
{
free(node);
……
[/Quote]
++
图灵狗 2012-09-02
  • 打赏
  • 举报
回复
1、第一次free后,node所指向的内存已经被释放,而此时node指向仍是原处;
2、free之后,其它代码段就可以使用这段内存了,也就是说这段内存数据的变化已经不在掌控之中;
3、第二次free的时候,其结果不可预料,这是典型的野指针行为。
所以,最好的做法是free之后,马上把node赋值为NULL,例如:
if(node != NULL)
{
free(node);
node = NULL;
}
漫步者、 2012-09-02
  • 打赏
  • 举报
回复
while ((node = *ref) != NULL) {
*ref = node->next;
free(node);//可能崩掉程序,假如你的节点到末尾了,但是你没有先进行判断,
//你而是进行free,这样的行为很可怕。
if (!unchain(ref)) {
break;
}
}
if(node != 0) {
free(node); //(double free valnerability)
//同上,可能崩溃等不可以预知的问题
return UNCHAIN_FAIL;
}

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧