一则悬空指针案例

c 复制代码
int* foo() {
    int a;          // 变量a的作用域开始
    a = 100;
    char *c = "xyz";   // 变量c的作用域开始
    return &a;
}                   // 变量a和c的作用域结束

先来看这样一段代码。这段代码虽然可以编译通过,但是其实非常糟糕,变量 ac 都是局部变量,函数结束后将局部变量 a 的地址返回,但局部变量 a 存在栈中,在离开作用域后,a 所申请的栈上内存都会被系统回收,从而造成了 悬空指针(Dangling Pointer) 的问题。这是一个非常典型的内存安全问题,虽然编译可以通过,但是运行的时候会出现错误。

我们可以通过两种方式来修改:

1. 返回动态分配的内存 :使用动态内存分配来分配a,确保返回的指针在函数结束后仍然有效。

c++ 复制代码
int* foo() {
    int *a = new int;  // 动态分配内存
    *a = 100;
    char *c = "xyz";   // 变量c的作用域开始
    return a;
}  // 变量c的作用域结束
// 使用完指针后记得释放内存

2. 使用静态变量:如果合适的话,可以使用静态变量,但这有可能会导致线程安全问题。

c++ 复制代码
int* foo() {
    static int a;     // 静态变量的生命周期为整个程序运行期间
    a = 100;
    char *c = "xyz";   // 变量c的作用域开始
    return &a;
}  // 变量c的作用域结束

最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB

相关推荐
小汉堡编程2 小时前
数据结构——vector数组c++(超详细)
数据结构·c++
weixin_472339465 小时前
高效处理大体积Excel文件的Java技术方案解析
java·开发语言·excel
枯萎穿心攻击5 小时前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎
Eiceblue7 小时前
【免费.NET方案】CSV到PDF与DataTable的快速转换
开发语言·pdf·c#·.net
tan180°7 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
m0_555762907 小时前
Matlab 频谱分析 (Spectral Analysis)
开发语言·matlab
浪裡遊8 小时前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
彭祥.9 小时前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
lzb_kkk9 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
好开心啊没烦恼9 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy