c/c++中delete/free 指针后,设置p=NULL的好处
2012-08-15 14:56
295 查看
从简单的代码开始:
int* p = new
int;
*p = 5;
delete p;
p = NULL;
Line4把释放了的指针立即设置为null,我们一般认识到是防止野指针的产生,从而导致程序崩溃。如:
int* p = new
int;
*p = 5;
delete p;
*p = 12; //这里崩溃
在Line4会崩溃。这种代码在即使有良好编码风格的代码中也无法避免,如:
int* p = new
int;
if(p != NULL)
{
*p = 5;
}
delete p;
if(p != NULL)
{
*p = 20; //这里同样崩溃
}
但是指针设置NULL之后良好的代码风格就可以避免崩溃了。如:
int* p = new
int;
if(p != NULL)
{
*p = 5;
}
delete p;
p = NULL;
if(p != NULL)
//条件不满足
{
*p = 20; //这里不会执行到了
}
但是代码风格不好(使用指针前不检测指针是否为空)的情况下,同样崩溃:
int* p = new
int;
*p = 5;
delete p;
p = NULL;
*p = 20;
这种崩溃和本文的第一例子代码中的崩溃有什么不同呢?
从程序使用性来看,都是程序不能用了。
但是安全性来看,可大不一样了。、
(1)在没有 "p = NULL;"时,指针p是指向一个内存地址的,只是这个内存地址对当前程序是非法的。对黑客来说,这可是一个机会。 每次程序崩溃时几乎都会在同一个地址(p所指的位置),这个地址会很容易到黑客手上的,然后黑客可以在指定的内存地址上事先布置好自己的代码,然后运行程序,崩溃时就会到黑客指定的代码上去,结果不堪设想啦。
(2)在有"p = NULL;"时,程序同样崩溃,但崩溃的地址是0. 0地址对任何程序都是非法的,所以再牛的黑客也不能把自己的代码布置到内存地址是0的空间上。所以对这种情况,黑客也只能面对崩溃 翻白眼,感叹生不逢时啊。
int* p = new
int;
*p = 5;
delete p;
p = NULL;
Line4把释放了的指针立即设置为null,我们一般认识到是防止野指针的产生,从而导致程序崩溃。如:
int* p = new
int;
*p = 5;
delete p;
*p = 12; //这里崩溃
在Line4会崩溃。这种代码在即使有良好编码风格的代码中也无法避免,如:
int* p = new
int;
if(p != NULL)
{
*p = 5;
}
delete p;
if(p != NULL)
{
*p = 20; //这里同样崩溃
}
但是指针设置NULL之后良好的代码风格就可以避免崩溃了。如:
int* p = new
int;
if(p != NULL)
{
*p = 5;
}
delete p;
p = NULL;
if(p != NULL)
//条件不满足
{
*p = 20; //这里不会执行到了
}
但是代码风格不好(使用指针前不检测指针是否为空)的情况下,同样崩溃:
int* p = new
int;
*p = 5;
delete p;
p = NULL;
*p = 20;
这种崩溃和本文的第一例子代码中的崩溃有什么不同呢?
从程序使用性来看,都是程序不能用了。
但是安全性来看,可大不一样了。、
(1)在没有 "p = NULL;"时,指针p是指向一个内存地址的,只是这个内存地址对当前程序是非法的。对黑客来说,这可是一个机会。 每次程序崩溃时几乎都会在同一个地址(p所指的位置),这个地址会很容易到黑客手上的,然后黑客可以在指定的内存地址上事先布置好自己的代码,然后运行程序,崩溃时就会到黑客指定的代码上去,结果不堪设想啦。
(2)在有"p = NULL;"时,程序同样崩溃,但崩溃的地址是0. 0地址对任何程序都是非法的,所以再牛的黑客也不能把自己的代码布置到内存地址是0的空间上。所以对这种情况,黑客也只能面对崩溃 翻白眼,感叹生不逢时啊。
相关文章推荐
- c/c++中delete/free 指针后,设置p=NULL的好处
- c/c++中delete/free 指针后,设置p=NULL的好处
- 指针delete后要设置为NULL
- 在删除一个指针之后,一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL)
- delete一个指针之后,要记得设置为NULL
- delete一个指针之后,要记得设置为NULL
- 类指针与NULL
- NULL指针、零指针、野指针
- void* 指针、NULL指针、零指针、野指针、悬垂指针
- React Native ListView的Item设置点击事件时null is not an object
- System.NullReferenceException:未将对象引用设置到对象的实例,这是一个新鸟,中鸟,老鸟都避不开的错误
- C++在delete指针之后是否要置为null
- NULL指针、零指针、野指针
- c++中未初始化的指针不等于NULL
- delete指针以后应赋值为NULL
- 浅析C++中的this指针 通过空指针(NULL)可以正确调用一些类的成员函数?
- C++在delete指针后要赋值为NULL
- 周末浅说--未将对象引用设置到对象的实例(System.NullReferenceException)
- spring 注解 @ResponseBody 返回JSON 设置不返回为 null 的值
- c/c++中空指针,空指针常量,NULL