WinCE平台下C#引用API(GDI)一个值得警惕的内存泄漏

简介:

由于C#精简框架集绘图函数不支持圆角矩形,所以引用了相关的API。

 

 
  1. [DllImport("\\windows\\coredll.dll", EntryPoint = "RoundRect")]  
  2.         private static extern int CeRoundRect(IntPtr hdc, int X1, int Y1, int X2, int Y2, int X3, int Y3);  

 这是有内存泄漏的源码:

 

 
  1. public static int RoundRect(Graphics e, Pen pen, SolidBrush brush, int X1, int Y1, int X2, int Y2, int X3, int Y3)  
  2.         {           
  3.             IntPtr hpen;  
  4.             IntPtr hbrush;  
  5.  
  6.             if(pen!=null)  
  7.             {  
  8.                 hpen = CreatePen((DashStyle.Solid == pen.DashStyle) ? 0 : 1,  
  9.                 (int)pen.Width, SetRGB(pen.Color.R, pen.Color.G, pen.Color.B));      //创建GDI画笔    
  10.             }  
  11.             else  
  12.             {  
  13.                 hpen = GetStockObject(8);      //空画笔  
  14.             }            
  15.  
  16.             if (brush!= null)  
  17.             {  
  18.                 hbrush = CreateSolidBrush(SetRGB(brush.Color.R, brush.Color.G, brush.Color.B)); //brush.Color.ToArgb());  
  19.             }  
  20.             else  
  21.             {  
  22.                 hbrush = GetStockObject(5);  
  23.             }  
  24.  
  25.             //pen.Dispose();  
  26.             //brush.Dispose();  
  27.  
  28.             IntPtr hdc = e.GetHdc();  
  29.             //---------------------     
  30.              SelectObject(hdc, hbrush);  
  31.              SelectObject(hdc, hpen);  
  32.  
  33.             int intRet=RoundRect(hdc, X1, Y1, X2,Y2, X3, Y3);  
  34.  
  35.             DeleteObject(hbrush);  
  36.             DeleteObject(hpen);  
  37.             //---------------------  
  38.             e.ReleaseHdc(hdc);  
  39.             return intRet;  
  40.         }  
  41.  

这是没有问题的源码:

 
  1. public static int RoundRect(Graphics e, Pen pen, SolidBrush brush, int X1, int Y1, int X2, int Y2, int X3, int Y3)  
  2.        {           
  3.            IntPtr hpen,old_pen;  
  4.            IntPtr hbrush, old_brush;  
  5.  
  6.            if(pen!=null)  
  7.            {  
  8.                hpen = CreatePen((DashStyle.Solid == pen.DashStyle) ? 0 : 1,  
  9.                (int)pen.Width, SetRGB(pen.Color.R, pen.Color.G, pen.Color.B));      //创建GDI画笔    
  10.            }  
  11.            else 
  12.            {  
  13.                hpen = GetStockObject(8);      //空画笔  
  14.            }            
  15.  
  16.            if (brush!= null)  
  17.            {  
  18.                hbrush = CreateSolidBrush(SetRGB(brush.Color.R, brush.Color.G, brush.Color.B)); //brush.Color.ToArgb());  
  19.            }  
  20.            else 
  21.            {  
  22.                hbrush = GetStockObject(5);  
  23.            }  
  24.  
  25.            //pen.Dispose();  
  26.            //brush.Dispose();  
  27.  
  28.            IntPtr hdc = e.GetHdc();  
  29.            //---------------------     
  30.            old_brush=SelectObject(hdc, hbrush);  
  31.            old_pen=SelectObject(hdc, hpen);  
  32.              
  33.            int intRet=RoundRect(hdc, X1, Y1, X2,Y2, X3, Y3);  
  34.  
  35.            SelectObject(hdc, old_brush);  
  36.            SelectObject(hdc, old_pen);  
  37.            DeleteObject(hbrush);  
  38.            DeleteObject(hpen);  
  39.            //---------------------  


            e.ReleaseHdc(hdc);
            return intRet;
        }

       看出代码的区别来了没有?泄漏的原因其实很简单,就是没有重新选入旧的画笔画刷。同样的程序(当然PC端的API库是GDI32)在上位机Window XP平台上没有什么问题(测试大约3天以上),而在WinCE平台确非常明显,大约1~3个小时(视圆角矩形绘图的多寡而定),该程序就会内存耗尽而死。


















本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/323438,如需转载请自行联系原作者

相关文章
|
3月前
|
JSON 数据挖掘 API
各大电商平台的商品详情数据接口(API接口系列)
各大电商平台的商品详情数据接口(API接口系列)是开发者在构建电商应用或进行数据分析时的重要工具。这些接口允许开发者通过编程方式获取商品的详细信息,如商品ID、标题、价格、库存、属性、描述、图片等。以下是对淘宝、京东、拼多多等电商平台商品详情数据接口的汇总,以及开发者在使用这些接口时需要注意的事项。
各大电商平台的商品详情数据接口(API接口系列)
|
3月前
|
编译器 API Android开发
Android经典实战之Kotlin Multiplatform 中,如何处理不同平台的 API 调用
本文介绍Kotlin Multiplatform (KMP) 中使用 `expect` 和 `actual` 关键字处理多平台API调用的方法。通过共通代码集定义预期API,各平台提供具体实现,编译器确保正确匹配,支持依赖注入、枚举类处理等,实现跨平台代码重用与原生性能。附带示例展示如何定义跨平台函数与类。
102 0
|
1月前
|
API
阿里云短信平台API错误码提示错误天级流控显示小时级错误码
阿里云短信平台API错误码提示错误天级流控显示小时级错误码
|
2月前
|
缓存 测试技术 API
电商平台 API 接入技术要点深度剖析
本文介绍了高效使用电商平台API的关键步骤。首先,深入理解API文档,明确功能权限与参数格式要求;其次,选择合适的接入方式,如HTTP/HTTPS协议和RESTful API;接着,实施身份验证与授权机制,确保数据安全传输;此外,还需关注性能优化、安全防护、监控与日志记录,以提升系统稳定性和响应速度;最后,进行充分测试与调试,并关注API版本更新,确保长期兼容性。
|
2月前
|
JSON 供应链 数据挖掘
抖音商品sku数据接口(Dy.item_sku)丨抖音平台API数据接口指南
抖音商品详情SKU数据接口(Dy.item_sku)由抖音开放平台提供,用于获取商品详细信息,包括名称、价格、图片等。开发者需注册并获取权限,遵循API限制,通过商品ID调用接口,解析JSON格式返回数据。该接口广泛应用于商品展示、库存管理、订单处理及数据分析,助力提升工作效率和用户体验。使用时需遵守平台规则,确保数据安全。
|
2月前
|
监控 Java 大数据
【Java内存管理新突破】JDK 22:细粒度内存管理API,精准控制每一块内存!
【9月更文挑战第9天】虽然目前JDK 22的确切内容尚未公布,但我们可以根据Java语言的发展趋势和社区的需求,预测细粒度内存管理API可能成为未来Java内存管理领域的新突破。这套API将为开发者提供前所未有的内存控制能力,助力Java应用在更多领域发挥更大作用。我们期待JDK 22的发布,期待Java语言在内存管理领域的持续创新和发展。
|
2月前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
70 0
|
3月前
|
Java API 数据中心
百炼平台Java 集成API上传文档到数据中心并添加索引
本文主要演示阿里云百炼产品,如何通过API实现数据中心文档的上传和索引的添加。
|
3月前
|
JSON API 开发者
GET方式请求速卖通平台API 接口:商品列表数据获取指南
速卖通商品列表数据接口(如 `aliexpress.item_search`)让开发者获取商品信息列表, 包括名称、价格等关键数据。接口支持按关键词、分类ID等条件获取商品列表及详细信息, 并可通过分页与排序优化展示效果。开发者需在速卖通开放平台注册并创建应用获取API密钥, 构建HTTP请求并处理JSON响应数据。[体验API](http://b.mrw.so/2Pv6Qu)。
|
3月前
|
缓存 测试技术 API
电商平台 API 接入技术要点深度剖析
这段内容详述了电商API接入的关键步骤:首先,深入了解API文档以明确功能权限及数据格式;其次,选择恰当的接入方式如RESTful API或RPC;接着实施身份验证与授权保障数据安全;处理数据传输与异常情况;利用缓存和并发提升性能;采用加密手段和限流策略加强安全防护;持续监控API状态并记录日志;最后,通过充分测试确保稳定性和进行版本管理以适应API迭代。