如何避免内存泄漏
2016-03-27 22:33
302 查看
int *x; x = new int[1000]; delete[] x; x = NULL;
new语句所返回的地址是访问这个内存块的唯一线索,同时也是delete语句用来把这个内存块归还给内存池的唯一线索。
1、分配了一个内存块但忘记了释放它,这是一种严重的错误。这样的内存块将等到程序执行结束时才会被释放掉。
2、会导致内存泄漏的另一种情况是用来保存内存块地址的指针变量作用域问题
void foo() { My Class *x; x = new MyClass(); }
退出函数时,栈空间将被自动收回,因为栈空间是有系统分配系统自动收回的。
当foo()函数结束时,指针变量x将超出它的作用域,这意味着它将不复存在,它的值当然就会丢失。
有两种方法可以用来堵住这样的漏洞:
第一个方法是在return语句之前的某个地方插入一条delete x语句:void foo(){ MyClass *x; x = new MyClass(); delete x; x = NULL; return; }
第二个方法是让函数把内存块的地址返回给它的调用者:
MyClass *foo() { MyClass *x; x = new MyClass(); return x; }
动态内存不存在作用域的问题,一旦被分配,内存块就可以在程序的任何地方使用。
因为动态内存没有作用域,所以必须由程序员来跟踪它们的使用情况,并在不再需要用到它们的时候把它们及时归还给系统。
这里需要特别注意的是,虽然动态分配的内存块没有作用域,但用来保存其地址的指针变量是受作用域影响的。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性