一则悬空指针案例

news/2025/5/16 9:17:24/
int* foo() {int a;          // 变量a的作用域开始a = 100;char *c = "xyz";   // 变量c的作用域开始return &a;
}                   // 变量a和c的作用域结束

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

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

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

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

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

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

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


http://www.ppmy.cn/news/1505045.html

相关文章

【linux运维】大型文件查询特定字符串方案总结(如2GB的文本文件)

对于大型文件(如2GB的文本文件),直接使用 grep 或其他文本处理工具可能会消耗大量的内存资源。为了更高效地处理这种情况,可以采用以下几种策略: 1. 使用 grep 的性能优化 尽管 grep 是非常高效的工具,但…

Unity复制对象时让私有变量也被复制的简单方法

Unity复制对象时,如果一个变量为公共变量(public),那么这个变量的值会被复制到新的对象中去,但是如果一个变量是私有变量(private),默认是不会被复制的,如果希望被复制&a…

pytorch学习笔记5 tensor 广播broadcasting

不同shape直接加减,系统会自动做broadcasting操作 先右对齐(小维度对齐) 比如:Feature maps: [4,32,14,14] Bias:[32,1,1] >][1,32,1,1] >[4,32,14,14] 做到与Feature maps的shape相同,才…

【Vulnhub系列】Vulnhub Connect-The-Dots 靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub Connect-The-Dots靶场渗透 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、主机发现 二、端口扫描 PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 2.0.8 or…

C++选择题带答案

(1) 若变量已正确定义并赋值,表达式____不符合C语言语法。 A) a*b/c; B) 3.14%2 C) 2, b D) a/b/c (2) _____是不正确的字符常量。 A)ˊnˊ B) ˊ1ˊ C)"a" D) ˊ101ˊ (3) 在 C 程序中&#xf…

【Python学习手册(第四版)】学习笔记14-迭代器和列表解析(一)

个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文主要以通俗易懂的语言介绍迭代器(文件迭代、手动迭代iter和next等),列表解析式包括基础知识包括写法、文件上使用列表解析…

STL-stack容器适配器

目录 一、容器适配器 二、使用 三、模拟实现 一、容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。 STL中,stack是由dequ…

sql注入时,waf屏蔽了information_schema如何处理?

information_schema可代替库 如果使用正则表达式屏蔽了information,则想一想有没有能代替的information的库。 例如:x$schema_table_statistics这个库里面就有table_schema和table_name,但是没有列名,那么列名就需要使用无列名注…