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;
}
以上代码,对于二次回收带来的安全隐患是什么?请详细解释下,谢谢!
[解决办法]
不可预知。
[解决办法]
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;
}
[解决办法]
1、第一次free后,node所指向的内存已经被释放,而此时node指向仍是原处;
2、free之后,其它代码段就可以使用这段内存了,也就是说这段内存数据的变化已经不在掌控之中;
3、第二次free的时候,其结果不可预料,这是典型的野指针行为。
所以,最好的做法是free之后,马上把node赋值为NULL,例如:
if(node != NULL)
{
free(node);
node = NULL;
}
[解决办法]
[解决办法]
free之后,马上把node赋值为NULL,例如:
if(node != NULL)
{
free(node);
node = NULL;
}
[解决办法]