zl程序教程

您现在的位置是:首页 >  后端

当前栏目

《从缺陷中学习C/C++》——6.11 函数中途退出忘记释放内存

C++内存学习 函数 退出 释放 忘记 缺陷
2023-09-11 14:17:38 时间

本节书摘来自异步社区出版社《从缺陷中学习C/C++》一书中的第6章,第6.11节,作者: 刘新浙 , 刘玲 , 王超 , 李敬娜 , ,更多章节内容可以访问云栖社区“异步社区”公众号查看。

6.11 函数中途退出忘记释放内存

从缺陷中学习C/C++
代码示例

int func(char* in, int inlen)

 char *p = new char[20];

 if ( inlen 20 ) {

 return 0;

 strncpy(p, in, 20);

 delete [] p;

 return 1;

现象 结果
若inlen 20,则函数中途退出,而未释放内存,导致内存泄露。

Bug分析
上述代码中,func函数内new了一块内存,在if条件分支中,没有释放内存,就直接return 0,致使函数在条件分支中退出,导致了内存泄露。

正确代码
在程序退出前添加释放内存语句 delete [] p。

if ( inlen 20 ) {

 delete [] p;

 return 0;

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

分享


爱上c++的第一天:内存存储模型,引用和函数方面的知识 在运行的时候调用程序分配内存可以在任何时候决定分配内存即分配的大小,用户自行决定在何时释放。堆中的所有东西都是匿名的,不能用名字访问,只能通过指针来访问。
C++内存分区模型分析与实例以及扩展 C++程序在执行时,将内存大方向划分为**5个区域** - 代码区:存放**函数体的二进制代码**,由操作系统进行管理的 - 全局区(静态区):存放**全局变量和静态变量以及常量** - 常量区:**常量**存储在这里,不允许修改 - 栈区:由编译器自动分配释放, 存放**函数的参数值**,**局部变量等** - 堆区:**由程序员分配和释放**,若程序员不释放,程序结束时由操作系统回收
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。