欢迎来到代码驿站!

C代码

当前位置:首页 > 软件编程 > C代码

C++野指针和悬空指针的实现方法

时间:2022-01-11 10:30:02|栏目:C代码|点击:

野指针和悬空指针是指针中常见的两个概念,本文结合实例讲解来讲解下。

一、野指针

野指针是指尚未初始化的指针,既不指向合法的内存空间,也没有使用 NULL/nullptr 初始化指针。

来看一个简单例子:

#include <iostream>
using namespace std;
 
int main()
{
    int *p;     // 野指针
    int *q = NULL; // 非野指针
    p = new int(5);  // p 现在不再是野指针
    q = new int(10); 
    cout<<"*p = "<<*p<<endl;
    cout<<"*q = "<<*q<<endl;
    free(p);
    free(q);
    return 0;
}

输出结果为:

linuxy@linuxy:~/wildPointer$ ./main
*p = 5
*q = 10
linuxy@linuxy:~/wildPointer$

p 在定义时并没有赋初值,这时候为野指针。

二、悬空指针

悬空指针是指 指针指向的内存空间已被释放或不再有效。

有三种情况会产生悬空指针,下面结合实例来看一下:

2.1 情况一

释放指针资源后,未再次赋值前。

#include <iostream>
using namespace std;
 
int main()
{
    int *p = new int(5);
    cout<<"*p = "<<*p<<endl;
    free(p);  // p 在释放后成为悬空指针
    p = NULL; // 非悬空指针
    return 0;
}

p 指针在被 free 后,成为悬空指针,被 NULL 赋值后不再是悬空指针。

注意:这里 free 掉的是 p 的内存空间,并不是变量 p,结合一个例子看下:

#include <iostream>
using namespace std;
 
int main()
{
    int *p = new int(5);
    cout<<"*p = "<<*p<<endl;
    cout<<"p 地址:"<<p<<endl;
    free(p);  // p 在释放后成为悬空指针
    cout<<"p 地址:"<<p<<endl;
    cout<<"*p = "<<*p<<endl;
    p = NULL; // 非悬空指针
    return 0;
}

输出结果为:

linuxy@linuxy:~/wildPointer$ ./main
*p = 5
p 地址:0x55a885ef6eb0
p 地址:0x55a885ef6eb0
*p = 0
linuxy@linuxy:~/wildPointer$

可以看到, free 前后 p 的地址是不变的,free 释放的是 p 指向的内存空间,释放后表示该快内存可以重新分配了,至于 free 后 *p 的值,视不同编译器情况而不同。

2.2 情况二

超出了变量的作用范围。

#include <iostream>
using namespace std;
 
int main()
{
    int *p;
    {
        int tmp = 10;
        p = &tmp;
    }
    //p 在此处成为悬空指针
    return 0;
} 

在上述例了中,变量 tmp 的作用范围为最近的一层括号内,在括号外引用便超出了变量的作用范围。

2.3 情况三

指向了函数局部变量。

#include <iostream>
using namespace std;
 
int* getVal() {
    int tmp = 10;
    return &tmp;
}
 
int main()
{
    int *p = getVal(); //悬空指针
    cout<<"*p = "<<*p<<endl;
    return 0;
}

在函数 getVal 执行完后,局部变量的内存空间会被释放,而这里 p 指向了函数内的局部变量,p 便成为了悬空指针,可以将 tmp 变为 static 的。

上一篇:C++ Primer中&、*符号的多重定义与int *p和int* p的区别讲解

栏    目:C代码

下一篇:带你了解C++的动态内存分配

本文标题:C++野指针和悬空指针的实现方法

本文地址:http://www.codeinn.net/misctech/189797.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有