为什么超过了变量作用范围会导致野指针

文章讲述了C++中野指针的概念,重点在于局部变量作用结束后返回其地址可能导致的问题。提出应避免使用指向局部变量的指针,改用动态内存分配、全局变量或静态变量,并通过示例代码演示了问题及解决方案。
摘要由CSDN通过智能技术生成

超过变量作用范围会导致野指针的原因是,当一个变量的作用范围结束时,它所占用的内存空间会被释放,但指向该内存空间的指针仍然存在。这样的指针被称为野指针。使用野指针访问已经释放的内存空间会导致未定义的行为,可能会产生随机值、崩溃或者其他不可预测的结果。

在C++中,当一个函数返回一个指向局部变量的指针时,这个指针就成为了野指针。因为局部变量的作用范围在函数结束时就结束了,它所占用的内存空间会被释放。但是返回的指针仍然指向这块已经释放的内存空间,这就是野指针的产生原因。

为了避免野指针的问题,我们应该尽量避免使用指向局部变量的指针。可以使用动态内存分配来创建指针,或者使用全局变量或静态变量来存储数据。另外,当指针不再使用时,应该将其置为nullptr,以避免误用。

范例:<<引用:以下是一个C++代码示例,展示了野指针的问题和解决方法:

以下错误示范:

#include <iostream>
using namespace std; 
int* createInt() 
{ 
    int num = 42; 
    int* ptr = &num; 
    return ptr; // 返回局部变量的地址 
} 

int main() 
{ 
    int* invalidPtr = createInt(); // 由于指针指向的内存已经超出作用域,访问该指针将导致未定义的行为
    cout << invalidPtr << endl; // 可能输出随机值或崩溃
    // 解决方法:避免使用如下指向局部变量的指针 
    // int num = 42; 
    // int* validPtr = &num; 
    // cout << *validPtr << endl; 
    return 0;
}

这段代码中,函数createInt()返回了一个指向局部变量num的指针ptr。在main()函数中,我们将返回的指针赋值给invalidPtr,然后尝试输出该指针的值。由于指针指向的内存已经超出了作用范围,访问该指针将导致未定义的行为,可能输出随机值或崩溃。

为了解决这个问题,我们可以避免使用指向局部变量的指针,而是使用其他方法来存储数据,如使用动态内存分配、全局变量或静态变量。这样可以确保指针指向的内存空间在需要时仍然有效。

可以写成:

#include <iostream>
using namespace std;

int num = 42;
int* createInt()
{

  //static int num = 42;或者将其变为静态变量,亦或是动态分配内存

  //int* pi = new int(1);//表示动态分配一个int ,初始化为 1
  //int* pa = new int[1];//表示动态分配一个数组,数组大小为1个int
  int* ptr = &num;
  return ptr; // 返回全局变量的地址
}

int main()
{
  int* invalidPtr = createInt();
  cout << invalidPtr << endl; 
  return 0;
}

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值