发新话题
打印

[原创] 关于空悬指针

关于空悬指针

/*什么叫空悬指针:指针所指向的存储区的生存期以及结束,但是指针的生存期还没有结束,导致
存储区的数据已经被释放,指针所指的区域是个随机值的这种错误。那么这个指针就叫空悬指针。
出现空悬指针的两种常见情况:
1.函数返回一个自动型局部变量的地址,我以前就经常出现这种情况
2.删除一个动态分配的对象以后,没有将指针指0,后面使用到这个指针的时候其实已经指向一个
随机值。
对2的一点补充,注意动态分配的时候,指针的生存期跟指针所指区域的生存期是两个不同的概念。
指针的生存期从程序开始运行开始,结束于程序结束运行,指针本身的存储区间是编译的时候就
确定的,指针所指的动态分配的区间的生存期从new开始,到delete结束,所以如果调用delete后
没有把指针指0就出现了空悬指针,此时很容易犯错误。

解决空悬指针的方法:1.对应情况1,函数返回一个静态局部变量
            2.对应情况2,调用delete以后,将指针指空。
*/
#include<iostream>
using namespace std;
int * add1(const int & a,const int &b)
{
    int c=a+b;
    cout<<"在函数add1的内部结果为"<<c<<endl;
    return &c;
}
//哈哈,在编译这个函数的时候vc6.0给出了下面的警告:
//warning C4172: returning address of local variable or temporary


int * add2(const int &a,const int & b)
{
    static int c=a+b;
    cout<<"在函数add2的内部结果为"<<c<<endl;
    return &c;
}

int * add3(const int &a,const int &b)
{
    int *p=new int;
    *p=a+b;
    cout<<"在函数add3的内部结果为"<<*p<<endl;     
    return p;
}

void main()
{
    int a=1,b=2,*p;
    cout<<"调用add1返回一个空悬指针\n";
    p=add1(a,b);
    cout<<"指针所指的值为"<<*p<<endl;
    cout<<"指针所指的值发生改变 了吗?\n"<<(*p==3?"没有改变":"改变")<<endl;
    cout<<"调用add2可以避免返回一个空悬指针 "<<endl;
    p=add2(a,b);
    cout<<"指针所指的值为"<<*p<<endl;
    cout<<"指针所指的值发生改变 了吗?\n"<<(*p==3?"没有改变":"改变")<<endl;
    cout<<"调用add3可以避免返回一个空悬指针 "<<endl;
    p=add3(a,b);
    cout<<"指针所指的值为"<<*p<<endl;
    cout<<"指针所指的值发生改变 了吗?\n"<<(*p==3?"没有改变":"改变")<<endl;
    delete p;
    p=0;
}

TOP

个人觉得学术会堂应该是我们发表个人见解的地方,大家怎么都不支持我的原创呢

TOP

java中没有指针,但有垃圾回收机制,由java虚拟机JVM自动检测内存中的垃圾对象,并销毁.
这在一定程度上增强了程序的安全性,减轻了程序员的负担.
不过,外界有传言,java7中似乎要加入指针.

TOP

呵呵,LS说的是对动态分配的内存自动释放吧,C++也有智能指针auto_ptr啊,可以自动释放动态分配的内存的

TOP

发新话题