一则悬空指针案例

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

相关推荐
郝学胜-神的一滴1 小时前
Python 高级编程 026:内置数据结构之骈文纵论
开发语言·数据结构·python·程序人生·软件工程
隐积8 小时前
3.1.7.Qt容器大家族(3):QVariant——万能盒子
开发语言·qt
Tri_Function10 小时前
动态规划DP1(c++)
c++
名字还没想好☜11 小时前
Next.js ‘use client‘ 到底加在哪:Server/Client Components 边界与常见报错
开发语言·前端·javascript·react·next.js
初级代码游戏12 小时前
iOS开发 Swift 速记1:变量和基本数据类型
开发语言·ios·swift
酷在前行13 小时前
【R生态】PERMANOVA 进阶实战:距离选择、PERMDISP、两两比较与受限置换(保姆级教程)
开发语言·r语言
cxr82813 小时前
Graphify vs GitNexus vs CodeGraph — 三工具架构深度对比
开发语言·架构·知识图谱
清水迎朝阳13 小时前
客户端软件 — 用户统计方案
服务器·c++·客户端·用户统计
废弃的小码农14 小时前
功能测试--Day07--Python编程基础
开发语言·python
再卷也是菜14 小时前
C++17(下)
c++