《从缺陷中学习C/C++》——6.9 重复申请内存未释放
2023-09-11 14:17:38 时间
本节书摘来自异步社区出版社《从缺陷中学习C/C++》一书中的第6章,第6.9节,作者: 刘新浙 , 刘玲 , 王超 , 李敬娜 , ,更多章节内容可以访问云栖社区“异步社区”公众号查看。
从缺陷中学习C/C++
代码示例
unsigned char* Func(void) unsigned char *stra; stra = (unsigned char *)malloc(10); return stra; int main() unsigned char *strb; strb = Func(); strb = (unsigned char *)malloc(10); free(strb); return 0;
现象 后果
用一个指针指向两次动态分配的内存,但只free一次,造成内存泄露。使用cppcheck工具检测,可以得到类似下面的信息:(error) Memory leak: strb。
Bug分析
Func函数中申请了内存赋值给strb, 然后在main函数中又动态分配了内存赋值给strb。在free(strb)时,实际只是释放了最后一次动态申请的内存,Func函数中申请的内存被漏掉了。第一次申请的内存没有被释放,造成内存泄露。
正确代码
unsigned char* Func(void) unsigned char *stra; stra = (unsigned char *)malloc(10); return stra; int main() unsigned char *strb; strb = Func();free(strb); strb = (unsigned char *)malloc(10); free(strb); return 0;
编程建议
这是一个小问题。两次动态分配的内存,但只free一次,造成内存泄露。记得申请释放内存时要注意malloc和free配对,申请几次释放几次。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。
C++ Primer Plus 第6版 读书笔记(2)第2章 开始学习 C++ C++是在 C 语言基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言,是C语言的超集。本书是根据2003年的ISO/ANSI C++标准编写的,通过大量短小精悍的程序详细而全面地阐述了 C++的基本概念和技术,并专辟一章介绍了C++11新增的功能。
C++ STL学习之【反向迭代器】 适配器模式是 STL 中的重要组成部分,在上一篇文章中我们学习了 容器适配器 的相关知识,即 stack 与 queue,除了 容器适配器 外,还有 迭代器适配器,借助 迭代器适配器,可以轻松将各种容器中的普通迭代器转变为反向迭代器,这正是适配器的核心思想
C++ STL学习之【容器适配器】 适配器(配接器)是 STL 中的六大组件之一,扮演着轴承、转换器的角色,使得 STL 中组件的使用更为灵活,比如 栈和队列 就是属于适配器而非容器,以及神秘的反向迭代器也属于适配器
C++ STL学习之【vector的模拟实现】 vector 是 STL 中的容器之一,其使用方法类似于数据结构中的 顺序表,得益于范型编程和 C++ 特性的加持,vector 更强大、更全能;在模拟实现 vector 时,还需要注意许多细枝末节,否则就很容易造成重复析构及越界访问
C++ STL学习之【vector的使用】 vector 是表示可变大小数组的序列 容器,其使用的是一块 连续 的空间,因为是动态增长的数组,所以 vector 在空间不够时会扩容;vector 优点之一是支持 下标的随机访问,缺点也很明显,头插或中部插入效率很低,这和我们之前学过的 顺序表 性质很像,不过在结构设计上,两者是截然不同的
C++ STL学习之【string类的模拟实现】 string 本质上就是一个专注于存储字符的顺序表,使用起来很方便;但在模拟实现 string 时,有许多值得注意的点,下面就来看看 string 类是如何诞生的吧
C++ STL 学习之【string】 STL 是 C++ 的重要组成部分,由六大部分构成:伪函数、空间配置器、算法、容器、迭代器 和 配接器,其中各种各样的 容器 可以很好的辅助我们写程序,比如今天要介绍的 string,有了它之后,我们对字符串的操作就能变得行云流水
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- C++ 构造函数_内存分区_对象初始化
- C++ 常用设计模式
- C/C++——程序的内存分配
- Delphi中结构体成员内存偏移基址计算方法(C++中的offsetof 的实现)
- c++ set与unordered set的区别
- 64 C++ - 标准异常库
- 52 C++ - 纯虚函数和多继承
- C++第10周项目5参考——贪财的富翁
- C++ 类的实例中 内存分配详解
- c++ 中return返回值与内存的分配释放详解
- c++内存测试
- C++ 内存分区模型
- C++在堆上申请和释放内存 - new & delete
- 开源免费的C/C++网络库(c/c++ sockets library)补充
- 使用c++filt命令还原C++编译后的函数名
- 《从缺陷中学习C/C++》——6.11 函数中途退出忘记释放内存
- 《从缺陷中学习C/C++》——6.12 二维数组的内存泄露
- 基于QT(C++)实现用户界面系统【100010114】
- C++ 内存管理与智能指针
- C/C++中的一些关键字理解
- C++获得本机所有网卡的IP和MAC地址信息
- C++ 锁机制以及常用方法(理论+实践)
- 136、【贪心算法】leetcode ——860. 柠檬水找零(贪心策略)(C++版本)
- C++对象内存分布(3) - 菱形继承(virtual)
- linux 下Eclipse for C/C++的不常见设置
- 2021-10-23VSCode + CMake + MinGW for C/C++/配置文件
- C++实操 - 内联成员函数