手机内存检测.ppt
《手机内存检测.ppt》由会员分享,可在线阅读,更多相关《手机内存检测.ppt(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1内存泄漏检测2主要内容内存泄漏定义内存泄漏原因分析内存泄漏检测方法内存泄漏检测工具内存泄漏的防范讨论3内存泄漏的定义程序中的内存结构p程序中内存分为堆、栈、全局/静态存储区和常量存储区.p全局常量位于常量存储区.p全局变量位于静态数据区.p局部变量以及函数参数变量位于栈.p使用new/malloc分配的内存位于堆上.栈 代码区静态数据区高端内存区域 常量存储区堆低端内存区域常量存储区域和静态数据区域的内存在程序退出时释放栈中分配的内存在变量离开其作用域时释放堆中分配的内存必须显示的释放4内存泄漏的定义内存泄漏的定义p程序中从堆中分配的内存在使用完毕后忘记释放,从而失去对该块内存的控制,导致该
2、块内存一直被占用直至程序退出。程序一直分配内存,直到程序退出才释放所有内存。内存泄漏的危害p程序占用内存越来越多,使得整个系统运行速度越来越慢。糟糕者可用内存耗尽,应用程序崩溃。5内存泄漏的定义内存泄漏的分类p常发性内存泄漏发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。p一次性内存泄漏发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。p偶发性内存泄漏发生内存泄漏的代码只会被执行一次p隐式内存泄漏程序在运行过程中不停的分配内存,但是直到结束的时候才
3、释放内存6内存泄漏原因分析new出来的对象没有deletep代码中没有delete的地方p指针被重新赋值了,赋值前没有deletep逻辑分支考虑不全。函数内部逻辑考虑不周。接口调用时序逻辑考虑不全CUDPSocket*CreateUdpSocket(const std:string&sIpAdress,UINT nLocalAudioPort)CUDPSocket*pUdpSocket=new CUDPSocket();CInetAddress oInetAddress(sIpAddress);SOCKERROR err=pUdpSocket-Create(&oInetAddress,nLoc
4、alAudioPort);if(SOCKET_SUCCESS!=err)/delete pUdpSocket;/pUdpSocket=0;return NULL;return pUdpSocket;内存泄漏原因分析基类析构函数非虚p当基类指针指向派生类对象,delete该基类指针时派生类对象的析构不会被调用。如果派生类中使用了stl容器或者从堆中分配内存的作为成员变量,那么内存泄漏就悄无声息的发生了。7class CIavpMsgpublic:CIavpMsg()CIavpMsg()printf(CIavpMsg()rn);class CLogMsg:public CIavpMsgpublic
5、:CLogMsg()CLogMsg()printf(CLogMsg()rn);public:string m_sTime;int _tmain(int argc,_TCHAR*argv)CIavpMsg*pMsg=new CLogMsg();string&sTime=(CLogMsg*)pMsg)-m_sTime;int nCapacity=sTime.capacity();printf(sTime初始内存大小:%drn,nCapacity);sTime=2010年月日:18:01;nCapacity=sTime.capacity();printf(sTime赋值内存大小:%drn,nCapa
6、city);const char*pStr=sTime.c_str();delete pMsg;printf(LogMsg对象删除后m_sTime的内容:%srn,pStr);return 0;内存泄漏原因分析8内存泄漏原因分析delete一个只有声明没有定义的类p 为了避免C/C+头文件中包含很多的其他头文件,通常将关联到的其他类型声明一下即可,在真正使用的地方包含其类定义的头文件。p如果在某个地方delete一个只有声明,而没有包含其类定义的头文件,那么该delete将不会去调用该类的析构函数。其结果和基类析构非虚导致派生类的析构不被调用的后果一样。9#pragma onceclass C
7、IavpMsg;class CIavpMsgFactorypublic:/从网络收到的消息创建成一个IavpMsg CIavpMsg*DynamicCreateMsg(const char*pMsgStream,int nStreamLen);#include stdafx.h#include iavpmsgfactory.hint _tmain(int argc,_TCHAR*argv)CIavpMsgFactory oMsgFactory;CIavpMsg*pMsg=oMsgFactory.DynamicCreateMsg(0,0);/DoSomeThingWithIavpMsg(pMsg
8、);delete pMsg;return 0;内存泄漏原因分析向容器中不断的添加内容,而不删除内容。p 写代码时疏忽,逻辑判断不正确导致此种情况发生。p接口设计不良,容器删除的职责不明。10内存泄漏原因分析11class CTTSPlayerpublic:TTSPlayTaskID PrepareTask(const char*ttstext,TtsPlayResultHandler&handler,void*param,const PlayEndPoint&endPoint)CTTSPlayerThread*pPlayerThread=new CTTSPlayerThread();m_oTT
9、SPlayerMapm_nID+=pPlayerThread;return m_nID;void Play(TTSPlayTaskID taskID)/1.从容器中找到playthread/2.异步调用playthread的play接口 void Stop(TTSPlayTaskID taskID)/1.从容器中找到playthread/2.delete playthread/3.从容器中删除playthread private:std:map m_oTTSPlayerMap;TTSPlayTaskID m_nID;Play失败,异步通知给调用者,调用者认为Play已经失败,没有必要再去调用S
10、top接口了,map容器中保存的对象永远不会被删除了,直至程序退出,从而导致内存泄漏!内存泄漏原因分析指针所有权不明p函数返回一个指针,却没说明该谁释放。12class CRtspClientpublic:/其他方法声明 /向RTSP服务器发送Option消息,返回服务器的响应结果 char*SendOption();private:/成员变量声明 ;返回值要不要delete?内存泄漏原因分析SDK或第三方库使用不当pFormatMessage方法指定FORMAT_MESSAGE_ALLOCATE_BUFFER则该方法得到的字符串为系统分配,需要LocalFree释放该字符串。13int _t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 手机 内存 检测
限制150内