前言

在C++中,指针是一个很常用的且复杂的变量类型,复杂是因为即便是熟悉C++的开发人员也会出现内存泄露,野指针等问题,今天就来记录一下什么是野指针。

概念

“野指针”不是NULL指针,是指向“垃圾”内存的指针。

概念可能看起来不太好理解,下面会将野指针的形成具体分为几种情况,分别说一下。

指针变量未初始化

通俗的讲,指针变量创建的时候并不会为NULL而是存在值的(这个值是随机的)。这个时候如果用NULL去判断则会返回false,这样非常危险!! 所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。如果没有初始化,编译器会报错“ ‘point’ may be uninitialized in the function ”

int main()
{
    void* p;  

    // 此时的p指针会随机指向一个地址,p会打印出来一个随机地址
    std::cout<< p <<endl;
}

指针释放后之后未置空

大家都知道,指针变量在使用完之后要手动释放,通常使用delete或者free,但这两个方法释放的是指针变量指向的地址上的内存,指针本身是不会释放的!!!,此时指针指向的就是“垃圾”内存。如果此时出现别的变量分配到此指针指向的“垃圾”内存,那将会非常危险!

因此delete和free后要及时给指针赋值NULL!!!

指针操作超越变量作用域

不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。示例程序如下:

class A {
public:
    void Func(void){ cout << “Func of class A” << endl; }
};
class B {
public:
    A *p;
    void Test(void)
    {
        A a;
        p = &a; // 注意a的生命期 ,只在这个函数Test中,而不是整个class B
    }
    void Test1()
    {
        p->Func(); // p 是“野指针”
    }
};

规避

简单地说就是:

初始化时置 NULL! 释放时置 NULL!