c# intPtr 内存泄漏问题

楚楚3107 楚楚3107 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我的这个程序是C#调用C++使用OpenCV实现二值图片缩放。返回数组c#再处理。
是在线程foreach循环中的,运行一段时间就内存飙升,怀疑内存泄露。
或者bmpimage.Save("Image\\" + (i + 1) + ".tiff", ImageFormat.Tiff);对象被占用。
或者主程序 Application.Run(new Fmain());对象被占用。
对象被占用的情况还是偶尔出。好头疼。困扰我多时了。我不知道我在循环中申请的intPtr到底改不改释放。

foreach (VDP_PictureBox.VDP_PictureBox pic in list_picture)
{
Bitmap bit3 = VDP_QrCodeEncoder.Encode(pi[i - index].urlStr.ToString());//生成一个bit3图像。
resize = (float)(pic.pictureBox1.Width) / (float)(bit3.Width);//获取缩放比例
BitmapInfo bina = GetImagePixel(bit3);//BitmapInfo是一个类。将图像转换成数组。代码略了。
int width = bit3.Width;
int height = bit3.Height;
int step = bina.Step;
if(Bitmap_mutex.WaitOne() == true)
{
IntPtr dst = showImages(out width, out height, out step, resize, bina.Result);//这里的dst需要释放么?
Bitmap img = new Bitmap(width, height, step, System.Drawing.Imaging.PixelFormat.Format32bppArgb, dst);
pic.pictureBox1.Image = img;

using (Graphics g3 = Graphics.FromImage(bmpimage))
{
g3.DrawImage(img, new Rectangle((int)((pic.Left + 5) * param),
(int)((pic.Top + 5) * param),
img.Width,
img.Height),
0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
}
bmpimage.Save("Image\\" + (i + 1) + ".tiff", ImageFormat.Tiff);//老是对象被占用。我改如何解决呀。
Bitmap_mutex.ReleaseMutex();
}
...全文

相关推荐

C#中IntPtr详解[项目代码]

本文详细介绍了C#中的IntPtr结构,它是一种表示指针或处理器本机大小的有符号整数,常用于保存内存地址或访问非托管代码(如Win32 API)。IntPtr在跨平台开发中非常有用,因为它的大小会根据运行时平台的实现自动调整,无需修改源代码即可在32位和64位系统间无缝切换。文章还通过示例代码展示了如何使用IntPtr获取应用程序的主窗口句柄,以及如何通过Marshal类访问非托管代码中的数据。示例包括使用Marshal.AllocHGlobal申请内存、Marshal.Copy复制数据、Marshal.ReadInt32读取数据等操作,并强调了操作内存时需注意的安全问题。

dell8

【C#】跨越托管与非托管边界:byte[]、struct、IntPtr与指针的高效互转实战

本文深入探讨了C#中托管与非托管内存间的高效数据转换技术,重点介绍了byte[]、struct、IntPtr与指针的互转方法。通过实战案例展示了如何优化性能、避免内存泄漏,并提供了处理音视频数据等高性能场景的最佳实践,帮助开发者提升跨边界数据处理的效率与安全性。

weixin_30721077

C#调用医保DLL实战:P/Invoke封装、编码与内存管理全攻略

在.NET开发中,调用由C/C++编译生成的原生动态链接库是常见的互操作需求,这种跨非托管边界的交互通常依赖P/Invoke技术。P/Invoke看似简单,但涉及字符串编码、内存分配、调用约定等底层细节,稍有不慎就会引发乱码、崩溃甚至内存泄漏。尤其在医疗、金融等传统行业,许多外部系统仍以DLL形式提供接口,例如医保结算组件,这在C#调用DLL时更具挑战性。理解char*与char**的封送规则、字符集(GBK/UTF-8)转换、输出缓冲区及释放协议,是成功集成的基础。通过合理设计DllImport声明、使用

CGGAO

C++调用C# DLL的跨语言互操作实践指南

跨语言互操作是混合编程中的关键技术,通过CLR(公共语言运行时)实现不同语言间的协同工作。其核心原理是利用中间层处理类型转换和内存管理,解决如C++原生代码与C#托管环境之间的差异。这种技术在系统集成、功能扩展等场景具有重要价值,特别是在需要复用成熟.NET组件或调用特定类库时。以C++/CLI桥接方案为例,通过创建混合模式程序集,开发者可以平衡性能与维护成本。实际应用中需注意COM互操作、GC根管理等技术细节,这些正是实现稳定跨语言调用的关键所在。

悟无误

C#全局hook实例

此为vs2010上建的项目,全局hook,全局捕捉键盘和鼠标事件!

speedup999
评论 14
收藏 已收藏
分享
返回顶部
楚楚3107
C# 111,128 成员 642,537 内容