读书人

关于C++编程的 野指针的有关问题

发布时间: 2012-02-12 17:16:33 作者: rapoo

关于C++编程的 野指针的问题
#include <iostream.h>
class B
{
public:
int i;
void Func(){cout < < "输出 " < <endl;}
};
void main()

{
B *p=new B;
delete p;
p-> i=5; //detele以后应该算是野指针了吧,这样赋值为什么还是可行的。我用的VC 6.0 而且能输出5和执行函数
cout < <p-> i < <endl;
p-> Func();
}
上面这个是什么问题,我不知道是因为编译器的问题还是我的概念出了问题!!!

[解决办法]
p虽然已经释放,这只是表明此内存区可以被其他变量使用,你之所以可以输出,说明目前还没有程序用到这个存储区,所以内容也没发生变化,但是这样做是很危险的,虽然编译器也不会报错如果这个地址已经被其他程序使用,对这个地区的更改会导致内容的改变,如果这个内容非常重要的话,那就惨了。尤其是比较大型的软件系统,所以要设计健壮的软件系统。

*********************************************************************
正解。所以delete p;后面一定要加上 p = NULL; 这是良好的编程规范。
[解决办法]
内存free后没有立即返回给内核,毕竟内核给各个进程的内存分配是以页为单位的,释放当然也是如此,free只是标记这块内存可以还给内存了,malloc/free有自己的机制决定什么时候把内存还给内核。当然这有个前提是采用虚拟内存机制(大部分pc上跑的操作系统都是这样的),每个进程都有自己的虚拟内存空间,这种情况下这个程序对野指针的访问是伤害不到其他程序的,野指针的危险在于对程序自身产生威胁。

读书人网 >C++

热点推荐