c# intPtr 内存泄漏问题

楚楚3107 2017-11-14 09:19:20
我的这个程序是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();
}
...全文
749 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Antony_WU_SZ 2017-11-20
  • 打赏
  • 举报
回复
GC回收的是托管内存,而非托管内存还是要用c++来手动释放比较稳妥。
星空蔚蓝 2017-11-15
  • 打赏
  • 举报
回复
将你的变量在循环体外定义,然后循环体内赋值,不知道会不会好一些
楚楚3107 2017-11-15
  • 打赏
  • 举报
回复
引用 10 楼 closurer 的回复:
引用 9 楼 chulijun3107 的回复:
[quote=引用 8 楼 closurer 的回复:] 作用域结束,是 GC 回收的必要不充分条件,作用域结束,GC 一般不会马上就回收的。因为 GC 的工作,也很耗费资源。
谢啦。IntPtr 声明的变量也需要手动释放么。
我刚才看了一下源码: https://referencesource.microsoft.com/#mscorlib/system/intptr.cs,d99bf6ad49979009 IntPtr 是不需要手动释放的。我第一个回答记错了。 [/quote]多谢指导
楚楚3107 2017-11-15
  • 打赏
  • 举报
回复
引用 12 楼 ranshouxu 的回复:
将你的变量在循环体外定义,然后循环体内赋值,不知道会不会好一些
不行的。改了更容易出错。
楚楚3107 2017-11-14
  • 打赏
  • 举报
回复
引用 8 楼 closurer 的回复:
作用域结束,是 GC 回收的必要不充分条件,作用域结束,GC 一般不会马上就回收的。因为 GC 的工作,也很耗费资源。
谢啦。IntPtr 声明的变量也需要手动释放么。
闭包客 2017-11-14
  • 打赏
  • 举报
回复
作用域结束,是 GC 回收的必要不充分条件,作用域结束,GC 一般不会马上就回收的。因为 GC 的工作,也很耗费资源。
闭包客 2017-11-14
  • 打赏
  • 举报
回复
我之所以没有看 Image 的源码,是因为我不管三七二十一,所有继承 IDisposable 接口的类,我在使用完之后,都会调用 Dispose() 方法。 这样比看源码省事多了。
楚楚3107 2017-11-14
  • 打赏
  • 举报
回复
引用 5 楼 qq_17486399 的回复:
GC回收是你作用域结束才会回收,而且回收效率没有我们想象中的那么给力,肯定没有循环快啊
多谢知道,那IntPtr 声明的变量也需要手动释放么
大鱼> 2017-11-14
  • 打赏
  • 举报
回复
GC回收是你作用域结束才会回收,而且回收效率没有我们想象中的那么给力,肯定没有循环快啊
楚楚3107 2017-11-14
  • 打赏
  • 举报
回复
引用 3 楼 closurer 的回复:
引用 2 楼 chulijun3107 的回复:
[quote=引用 1 楼 closurer 的回复:] 我没有记错的话,IntPtr 和 Image 都要释放。
Image不是GC回收么。真心不太懂。
我没有看过 Image 的源码,即使是 GC 回收,你要知道的是,GC 的回收频率是很慢的,如果你的 Image 是循环创建,那么回收的速度赶不上创建的速度,还是会内存溢出的。 [/quote]有道理,那我每次循环后image.Dispose();可以吧。
闭包客 2017-11-14
  • 打赏
  • 举报
回复
引用 2 楼 chulijun3107 的回复:
引用 1 楼 closurer 的回复:
我没有记错的话,IntPtr 和 Image 都要释放。
Image不是GC回收么。真心不太懂。
我没有看过 Image 的源码,即使是 GC 回收,你要知道的是,GC 的回收频率是很慢的,如果你的 Image 是循环创建,那么回收的速度赶不上创建的速度,还是会内存溢出的。
楚楚3107 2017-11-14
  • 打赏
  • 举报
回复
引用 1 楼 closurer 的回复:
我没有记错的话,IntPtr 和 Image 都要释放。
Image不是GC回收么。真心不太懂。
闭包客 2017-11-14
  • 打赏
  • 举报
回复
我没有记错的话,IntPtr 和 Image 都要释放。
闭包客 2017-11-14
  • 打赏
  • 举报
回复
引用 9 楼 chulijun3107 的回复:
引用 8 楼 closurer 的回复:
作用域结束,是 GC 回收的必要不充分条件,作用域结束,GC 一般不会马上就回收的。因为 GC 的工作,也很耗费资源。
谢啦。IntPtr 声明的变量也需要手动释放么。
我刚才看了一下源码: https://referencesource.microsoft.com/#mscorlib/system/intptr.cs,d99bf6ad49979009 IntPtr 是不需要手动释放的。我第一个回答记错了。

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧