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

简介: 由于C#精简框架集绘图函数不支持圆角矩形,所以引用了相关的API。 [DllImport("//windows//coredll.

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

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

 这是有内存泄漏的源码:

 public static int RoundRect(Graphics e, Pen pen, SolidBrush brush, int X1, int Y1, int X2, int Y2, int X3, int Y3)
        {        
            IntPtr hpen;
            IntPtr hbrush;

            if(pen!=null)
            {
                hpen = CreatePen((DashStyle.Solid == pen.DashStyle) ? 0 : 1,
                (int)pen.Width, SetRGB(pen.Color.R, pen.Color.G, pen.Color.B));      //创建GDI画笔 
            }
            else
            {
                hpen = GetStockObject(8);      //空画笔
            }         

            if (brush!= null)
            {
                hbrush = CreateSolidBrush(SetRGB(brush.Color.R, brush.Color.G, brush.Color.B)); //brush.Color.ToArgb());
            }
            else
            {
                hbrush = GetStockObject(5);
            }

            //pen.Dispose();
            //brush.Dispose();

            IntPtr hdc = e.GetHdc();
            //---------------------   
             SelectObject(hdc, hbrush);
             SelectObject(hdc, hpen);

            int intRet=RoundRect(hdc, X1, Y1, X2,Y2, X3, Y3);

            DeleteObject(hbrush);
            DeleteObject(hpen);
            //---------------------
            e.ReleaseHdc(hdc);
            return intRet;
        }

这是没有问题的源码:

 public static int RoundRect(Graphics e, Pen pen, SolidBrush brush, int X1, int Y1, int X2, int Y2, int X3, int Y3)
        {        
            IntPtr hpen,old_pen;
            IntPtr hbrush, old_brush;

            if(pen!=null)
            {
                hpen = CreatePen((DashStyle.Solid == pen.DashStyle) ? 0 : 1,
                (int)pen.Width, SetRGB(pen.Color.R, pen.Color.G, pen.Color.B));      //创建GDI画笔 
            }
            else
            {
                hpen = GetStockObject(8);      //空画笔
            }         

            if (brush!= null)
            {
                hbrush = CreateSolidBrush(SetRGB(brush.Color.R, brush.Color.G, brush.Color.B)); //brush.Color.ToArgb());
            }
            else
            {
                hbrush = GetStockObject(5);
            }

            //pen.Dispose();
            //brush.Dispose();

            IntPtr hdc = e.GetHdc();
            //---------------------  
            old_brush=SelectObject(hdc, hbrush);
            old_pen=SelectObject(hdc, hpen);
           
            int intRet=RoundRect(hdc, X1, Y1, X2,Y2, X3, Y3);

            SelectObject(hdc, old_brush);
            SelectObject(hdc, old_pen);
            DeleteObject(hbrush);
            DeleteObject(hpen);
            //---------------------
            e.ReleaseHdc(hdc);
            return intRet;
        }

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

相关文章
|
2月前
|
存储 弹性计算 数据中心
倚天产品介绍|倚天710平台稳定性-内存隔离降级运行
本文介绍利用倚天710平台的RAS特性,实现OS降级运行,提高系统稳定性
|
2月前
|
小程序 前端开发 JavaScript
视觉智能平台常见问题之抠人脸的api如何解决
视觉智能平台是利用机器学习和图像处理技术,提供图像识别、视频分析等智能视觉服务的平台;本合集针对该平台在使用中遇到的常见问题进行了收集和解答,以帮助开发者和企业用户在整合和部署视觉智能解决方案时,能够更快地定位问题并找到有效的解决策略。
33 3
|
9天前
|
机器学习/深度学习 人工智能 API
人工智能平台PAI产品使用合集之机器学习PAI-EAS部署好后,服务的公网API和URL怎么配置
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
15天前
|
缓存 Java API
[NDK/JNI系列05] JNI引用API
[NDK/JNI系列05] JNI引用API
20 0
|
2月前
|
搜索推荐 API
Email API Service平台有哪些?3大API接口平台对比
本文对比了三个Email API Service:AokSend、Mailgun和Postmark。AokSend提供高效邮件服务,其API适用于营销和通知邮件;Mailgun的API灵活强大,支持多种语言;Postmark专注于Transactional邮件,API设计简洁。每个平台都提供详尽的文档和支持,用户可根据需求选择。
|
2月前
|
机器学习/深度学习 API 计算机视觉
视觉智能平台常见问题之获取人脸皮肤的颜色Api如何解决
视觉智能平台是利用机器学习和图像处理技术,提供图像识别、视频分析等智能视觉服务的平台;本合集针对该平台在使用中遇到的常见问题进行了收集和解答,以帮助开发者和企业用户在整合和部署视觉智能解决方案时,能够更快地定位问题并找到有效的解决策略。
19 0
|
2月前
|
数据采集 供应链 前端开发
电商企业如何构建一站式数字化供应链体系|API接口实现淘宝/京东/1688多平台商品采集+上传一站式供应链系统搭建
网络时代,企业面临转型。如今进入数字化时代,企业再次面临重大变革,全面实现数字化、智能化已是当务之急。公司将继续良性发展,请记住16个字:精简流程、降低成本、提高效率、智慧管理。主流电商平台API商品数据采集接口,不但可以在商品采集上为供应链提供大量商品,同时我们也可以通过申请官方商品上传商品发布API接口,实现商品的多平台发布。
|
2月前
|
API 开发者
1688阿里巴巴中国站平台 API接口获取商品详情 接入文档说明
1688(阿里巴巴批发网)的API接入文档是专为开发者提供的,用于指导如何集成和使用1688平台提供的API接口。这些API接口可以帮助开发者实现各种功能,如商品搜索、订单管理、用户认证等。
|
3月前
|
人工智能 Serverless API
AI 绘画平台难开发,难变现?试试 Stable Diffusion API Serverless 版解决方案
AI 绘画平台难开发,难变现?试试 Stable Diffusion API Serverless 版解决方案
|
3月前
|
监控 Java API
JDK 9新特性深度探索:平台日志API和服务
本文将深入探讨JDK 9中引入的平台日志API和服务。这一新特性为Java应用程序提供了更强大、灵活的日志记录功能,帮助开发者更好地监控和诊断应用程序的运行状况。本文将详细介绍平台日志API和服务的特性和优势,以及如何在项目中应用这一新特性来提升应用程序的稳定性和可维护性。