社区
C++ 语言
帖子详情
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
打赏
收藏
c++内存释放隐患问题求解
while ((node = *ref) != NULL) { *ref = node->next; free(node); if (!unchain(ref)) { break; } } if(node != 0) { free(node); //(double free valnerability) return UNCHAIN_FAIL; } 以上代码,对于二次回收带来的安全隐患是什么?请详细解释下,谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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;
}
C++
基础面试
问题
总结
目录1.面向对象的特征?...11.
C++
内存
分为哪几块?12.简单介绍
内存
池?13.简单描述
内存
泄漏?14.
内存
中的堆与栈有什么区别?15.说几个
C++
11的新特性?16.简单介绍智能指针?17.shared_ptr 和 uniqu
【
C++
学习笔记】
C++
类和对象
(http://c.biancheng.net/c/80/)总结
C++
类的成员变量和成员函数详解在类体中和类体外定义成员函数的区别
C++
类成员的访问权限以及类的封装简单地谈类的封装对private和public的更多说明
C++
对象的
内存
模型
C++
函数编译...
C++
面试知识点总结
C++
支持两种多态:编译时多态(静态)、运行时多态(动态)编译时多态:就是在编译期确定的一种多态。在
C++
中主要体现在函数模板,这里需要注意,函数重载和多态无关,很多地方把函数重载误认为是编译多态,这是错误...
C++
多线程基础及
C++
11 多线程库总结
1. 多线程基础 1.1 进程与线程 根本区别: 进程是操作系统资源分配的基本单位,线程是任务调度和执行的基本单位 ...系统在运行的时候会为每个进程分配不同的
内存
空间。 对线程而言,系统不会为
C++
define 与inline浅析
define 用define 定义的常量: ...宏替换只作替换,不做计算,不做表达式
求解
,不进行类型安全检查,会造成大量安全
隐患
。 define定义简单函数
隐患
举例: 输入变量不加括号 #define SQUARE(X)
C++ 语言
64,647
社区成员
250,476
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章