几个小例子--memory leak
2016-07-13 23:48
405 查看
C++程序员最害怕、最容易遇到的问题就是内存泄露,或是说非法访问内存。
不想说太多的道理,就用几个简单的例子来诠释。
指针超过作用域
在释放前产生异常
没释放就赋值nullptr
new/delete new[]/delete[] malloc/free没有成对出现、没有匹配
释放两次,没有赋为nullptr
返回局域变量的指针
使用已经释放的指针
不要delete形参的指针
使用了没有分配内存的指针
delete非heap上的内存
不想说太多的道理,就用几个简单的例子来诠释。
指针超过作用域
void MemoryLeak( ) { int *data = new int; *data = 15; }
在释放前产生异常
void MemoryLeak() { int* ptr = new int; // do something which may throw an exception // we never get here if an exception is thrown delete ptr; }
没释放就赋值nullptr
int * a = malloc(sizeof(int)); a = 0; //this will cause a memory leak
new/delete new[]/delete[] malloc/free没有成对出现、没有匹配
char *s = (char*) malloc(5); delete s; //不能使用delete去释放malloc分配的内存
释放两次,没有赋为nullptr
char* pStr = (char*) malloc(20); free(pStr); free(pStr); // results in an invalid deallocation
返回局域变量的指针
MyClass* MemoryLeak() { MyClass temp; return &temp; }
使用已经释放的指针
... delete ptr; ptr = nullptr; ptr->show();
不要delete形参的指针
char* function( char* c) { char* temp = new char [ strlen (c) + 1 ]; strcpy ( temp, c ); delete[] c; //错误,不应该删除形参的指针 return temp;//错误,返回局域变量的指针 }
使用了没有分配内存的指针
MyWindow* window; window->show();
delete非heap上的内存
MyWindow window; delete window;
相关文章推荐
- 几个小例子--memory leak
- CDOJ 29 飞镖(dart) 解题报告
- ubuntu 16.04 安装 java 8 + eclipse
- 西湖徒步
- 一般图匹配带花树
- Maven 那点事儿 , maven 不同环境打包方案
- Valid Palindrome
- 在win7上安装ubuntu12.04双系统(uefi主板)
- php 在页面中调试错误(解决php错误500)
- Spark Scheduler模块源码分析之DAGScheduler
- Spark Scheduler模块源码分析之DAGScheduler
- Spark Scheduler模块源码分析之DAGScheduler
- Java 集合 JDK1.7的LinkedList
- android.support.v7.internal.widget.ActionBarOverlayLayout Couldn't Be Initialized
- iOS 图片转NSData-b
- Clone Graph
- 并查集模板
- Python 字符串格式化
- 详解:数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名及手工脚本创建oracle数据库
- ecshop和ecstouch的insert标签的用法