一则悬空指针案例

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

相关推荐
长安——归故李14 小时前
【modbus学习】
java·c语言·c++·学习·算法·c#
索迪迈科技14 小时前
STL库——map/set(类函数学习)
开发语言·c++·学习
Dfreedom.15 小时前
在Windows上搭建GPU版本PyTorch运行环境的详细步骤
c++·人工智能·pytorch·python·深度学习
ForteScarlet15 小时前
Kotlin 2.2.20 现已发布!下个版本的特性抢先看!
android·开发语言·kotlin·jetbrains
anlogic15 小时前
Java基础 9.10
java·开发语言·算法
yongche_shi15 小时前
第二篇:Python“装包”与“拆包”的艺术:可迭代对象、迭代器、生成器
开发语言·python·面试·面试宝典·生成器·拆包·装包
Elastic 中国社区官方博客15 小时前
介绍 Python Elasticsearch Client 的 ES|QL 查询构建器
大数据·开发语言·数据库·python·elasticsearch·搜索引擎·全文检索
Hóng xīng qiáo16 小时前
swVBA自学笔记014、Lisp适合对SolidWorks进行二次开发吗 ?
开发语言·笔记·lisp
一拳一个呆瓜16 小时前
【MFC】对话框:位置属性(居中、绝对对齐、X位置Y位置)应用示例
c++·mfc
m0_5522008216 小时前
《UE5_C++多人TPS完整教程》学习笔记48 ——《P49 瞄准偏移(Aim Offset)》
c++·游戏·ue5