Android开发小问题汇总

使用简介

在写程序的过程中,难免会遇到内存泄露的时候,这个时候如果手工查找内存泄露,不说方法没有通用的,就是真的要自己手工查找也是很耗时间和精力的。诚然,我们可以借助一些工具,而且我们还会惊奇地发现这些工具很有用(比如Intel的内存泄露检测工具),但是因为往往这些工具安装比较麻烦,而我们写的程序又不是很大,所以我们或许可以找个更小巧的方法。微软就提供了这样的方法,我们只需要在程序中加入几行代码,就可以发现内存泄露的问题,然后我们就可以定位内存泄露了(自己用几行代码就可以实现,神奇!)。那么如何实现了,主要的几个函数现先列举一下:_CrtDumpMemoryLeaks,_CrtMemCheckpoint,_CrtMemDifference

  • CrtDumpMemoryLeaks :当前所有没有销毁的对象(没有delete和free),默认情况下输出到调试窗口
  • _CrtMemCheckpoint:保存当前所有没有销毁的对象的状态
  • _CrtMemDifference:比较两个_CrtMemCheckpoint保存的状态,返回差异值

简单的使用_CrtDumpMemoryLeaks可以检测当前没有释放的对象,但是如果程序大一点,需要确定某一段程序是否有问题时,就需要后面的两个参数了。_CrtMemCheckpoint保存的是_CrtDumpMemoryLeaks的结果,如果我们在一段程序的前后分别保存一个状态,那么通过比较这两个状态我们就可以获知这一段程序是否有内存泄露的问题了。

使用示例

  • 启用内存泄露调试支持

    #define _CRTDBG_MAP_ALLOC
    #include <stdlib.h>
    #include <crtdbg.h>

    其中#define 语句将 CRT 堆函数的基础版本映射到对应的调试版本。 如果省略 #define 语句,内存泄漏转储将有所简化。

使用这些语句启用调试堆函数之后,可以在某个应用程序退出点之前设置一个对 _CrtDumpMemoryLeaks 的调用,以便在应用程序退出时显示内存泄漏报告:

_CrtDumpMemoryLeaks();

如果要为程序添加退出点时检测内存泄露,则可以通过设置调试选项来设置,而不需要在每个退出点自己添加函数_CrtDumpMemoryLeaks的调用:

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

默认情况下,输出的调试信息会在调试窗口,当然,你可以通过_CrtSetReportMode来自定义输出位置。

  • 比较内存泄露状态

定位内存泄漏的另一种技术涉及在关键点对应用程序的内存状态拍快照。 若要为应用程序中给定点的内存状态拍快照,创建 _CrtMemState 结构,将它传递给 _CrtMemCheckpoint 函数:

_CrtMemState s1;
_CrtMemCheckpoint( &s1 );

_CrtMemCheckpoint 会将当前内存状态填充在该结构中。

如果要查看输出 _CrtMemState 结构的内容,可使用_ CrtMemDumpStatistics 函数:

_CrtMemDumpStatistics( &s1 );

//_ CrtMemDumpStatistics 输出内存状态转储,如下所示:
// 0 bytes in 0 Free Blocks.
// 0 bytes in 0 Normal Blocks.
// 3071 bytes in 16 CRT Blocks.
// 0 bytes in 0 Ignore Blocks.
// 0 bytes in 0 Client Blocks.
// Largest number used: 3071 bytes.
// Total allocations: 3764 bytes.

若要确定在某个代码部分中是否发生了内存泄漏,可以对这部分之前和之后的内存状态拍快照,然后使用 _ CrtMemDifference 比较两个状态:

_CrtMemCheckpoint( &s1 );
// memory allocations take place here
_CrtMemCheckpoint( &s2 );

if ( _CrtMemDifference( &s3, &s1, &s2) )
{
	_CrtMemDumpStatistics( &s3 );
}

_CrtMemDifference比较内存状态 s1 和 s2,在 (s3) 中返回结果,即 s1 与 s2 的差异。

寻找内存泄漏的一个方法是,首先在应用程序的开头和结尾部分放置 _CrtMemCheckpoint 调用,然后使用 _CrtMemDifference 比较两个结果。 如果 _CrtMemDifference 显示有内存泄漏,通过添加更多 _CrtMemCheckpoint 调用来使用二进制搜索划分程序,直至找到泄漏源。

  • 贴一张自己使用的结果图

Android开发小问题汇总

时间: 2024-08-28 17:50:32

Android开发小问题汇总的相关文章

Android开发小问题总结

Android开发遇到的小问题之小解: @[email protected] 编译运行安卓程序时 eclipse里console里提示The launch will only sync the application package on the device 经查找是AndroidManifest.xml里的主activity里红色部分没加,, <activity            android:label="@string/XXX"            android

Android 开发小工具之:Tools 属性 (转)

Android 开发小工具之:Tools 属性 http://blog.chengyunfeng.com/?p=755#ixzz4apLZhfmi 今天来介绍一些 Android 开发过程中比较有用但是大家又不常用的小工具.这些小工具可以提高 Android 应用开发的效率.还可以提高代码质量.所以还是有必要使用的. 首先介绍布局文件中的 tools 属性. 如果你用 Android Studio 创建一个简单的示例项目,在生成的布局文件中会有这么一行内容: xmlns:tools="http:

学习Android开发相关站点汇总

Google免FQ镜像汇总 stackoverflow Android基础&进阶 深入理解Android 老罗的Android之旅 Android 精彩案例 Android源码解读 Android开发学习笔记 Git教程 免费下载各种外文科技论文书籍电子版

提高工作效率的16条Android开发小经验

笔者在经历了多个Android开发项目之后,个人积累也从别处学习了很多在Android开发中非常实用的小经验.下面从中选择了最实用的16条,分享给大家. 1.TextView中的getTextSize返回值是以像素(px)为单位的,而setTextSize()是以sp为单位的.所以如果直接用返回的值来设置会出错,解决办法是用setTextSize()的另外一种形式,可以指定单位: 1 2 3 4 <span style="font-size:16px;">setTextSi

Android 开发—— 小工具,大效率

欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:姚志锋 一.Hugo插件 -- 打印方法运行时间 首先申明下,此Hugo非 彼Hugo(Hugo是由Go语言实现的静态网站生成器). Hugo插件作用 : 能够计算并打印一个方法的输入参数和函数的运行时间 Hugo插件应用场景: 处理Android 应用卡顿问题 (1)先看实例 1)在对应方法处标注@DebugLog SearchResultPanel::dispatchResult处标记@Debug

Android开发所有视频教程汇总

1.Mars的Android开发视频教程作者讲解的很详细,很全面,系统.以前出了两套视频,分别是<Java4Android视频教程>.<Android视频教程>,以及最新刚新出的<Android视频教程重制版>.很负责人的老师.具体的Mars开发视频见其个人论坛:http://www.marschen.com/bbs/forum.php <Android视频教程重制版>下载地址:http://dl.vmall.com/c0qs8budkm 2.老罗Andro

Android开发小经验

1. TextView中的getTextSize返回值是以像素(px)为单位的, 而setTextSize()是以sp为单位的. 所以如果直接用返回的值来设置会出错,解决办法是 用setTextSize()的另外一种形式,可以指定单位: [java] view plaincopy <span style="font-size:16px;">setTextSize(int unit, int size) TypedValue.COMPLEX_UNIT_PX : Pixels

Android Studio:小问题汇总

1.将eclipse工程导入到android studio后的配置. Error: Your project contains C++ files but it is not using a supported native build system. 在app模块的build.grade中的BuildTypes中加上sourceSets{ main{jni.src.Dirs=[ ] } } 1.1.工作电脑gradle版本为3.1.2,gradle插件版本为4.4,新建activity什么都没

兔子--android开发小细节

1.android:paddingLeft="15dp" 内容距离左边的距离 android:layout_marginLeft="10dp" 整体控件距离左边的距离 2.linearlayout 默认是横向的,你textview不能横向居中,你把linearlayout改成纵向布局,textview设置成横向居中 3.android:layout_gravity="center_vertical" 控件居中 android:gravity=&q