悬空指针怎么没报错?
请看下面代码,我注释的地方为什么没有报错?空间已经被释放。
所以编绎器,VS2010
class HasPtr指针 悬空 类 Visual?Studio?2010
{
public:
HasPtr( int *p, int v ): ptr( p ), val( v ) { }
int get_ptr_val() const
{
return *ptr;
}
void set_ptr_val( int i ) const
{
*ptr = i;
}
private:
int *ptr;
int val;
};
#include "HasPtr.h"
#include <iostream>
using namespace std;
int main()
{
int *ip = new int( 42 );
HasPtr ptr( ip, 10 );
delete ip;
ptr.set_ptr_val( 0 ); //为什么没报错??
cout << ptr.get_ptr_val() << endl;
return 0;
}
[解决办法]
目测楼主期待的是语法上的“不能”,而实际上这是语义上的“不应该”。
http://blog.csdn.net/mougaidong/article/details/7016656
[解决办法]
不会的,只会提示警告之类的,编译器没那么智能
[解决办法]
如果编译器能报错,从此就没有内存泄露,野指针这个说法了。
[解决办法]
delete ip;
ptr.set_ptr_val( 0 ); //为什么没报错??
两句代码的行为“未定义”,“未定义”的意思就是说它导致什么结果都是可能的,当然也可以什么都不发生。
说明白点,就是说,ip所指向的内存块刚刚被回收,还没有分配出去,这时你通过ptr.set_ptr_val修改了这一内存块中的内容,只要没有破坏掉堆信息,就不会导致任何问题。但如果内存块被分配给了另一对象,那么ptr.set_ptr_val调用就会导致另一对象的数据被修改,被修改的对象就会另人莫名其妙地表现不正常。如果另一对象被修改的数据是虚拟表指针,那么这个对象的虚函数调用就会直接导致程序崩溃。
[解决办法]
其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。