一则悬空指针案例

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

相关推荐
小苗卷不动15 分钟前
OJ练习之疯狂的自我检索者(简单)
c++
LUVK_20 分钟前
第七章查找
数据结构·c++·考研·算法·408
迷途之人不知返22 分钟前
vector
c++
lhbian23 分钟前
AI编程革命:Codex让脚本开发提速10倍
开发语言·汇编·jvm·c#
jiayong2324 分钟前
第 36 课:任务详情抽屉快捷改状态
开发语言·前端·javascript·vue.js·学习
khalil102026 分钟前
代码随想录算法训练营Day-31贪心算法 | 56. 合并区间、738. 单调递增的数字、968. 监控二叉树
数据结构·c++·算法·leetcode·贪心算法·二叉树·递归
FFF_6345602329 分钟前
通用 vue 页面 js 下载任何文件的方法
开发语言·前端·javascript
小苗卷不动32 分钟前
进程与线程的核心区别
c++
阿奇__36 分钟前
uniapp支付宝 H5 开发踩坑,hash模式下取参要规范!
开发语言·uni-app
eggwyw38 分钟前
PHP搭建开发环境(Windows系统)
开发语言·windows·php