3

这个函数是循环的。当我运行程序时,带有 IntPtr 的行给我带来了内存问题,我已经把 delete[],但它仍然没有解决内存问题,有人可以帮忙吗?谢谢

void showImage(IplImage *img,System::Windows::Forms::PictureBox^ picturebox)
{

IntPtr ip(new unsigned char[img->widthStep*img->height]); // this line causing memory usage to keep going up very fast

//memcpy(ip.ToPointer(),img->imageData,img->widthStep*img->height);

//picturebox->Image = gcnew Bitmap(img->width,img->height, img->widthStep, System:rawing::Imaging::PixelFormat::Format24bppRgb, ip);

delete[] ip;
} 

这是 C++\CLI

4

1 回答 1

2

这段代码编译是相当可悲的,但这是设计使然。应用于托管类型的删除运算符实际上不会释放任何内存。它在传递的对象上调用 IDisposable::Dispose() 方法。令人遗憾的是,这甚至可以工作,IntPtr 被装箱以将其变成一个对象,然后检查它是否实现了 IDisposable 接口。它当然不会,什么都不会发生。

您必须传递从new运算符返回的指针。不要忘记在 finally 块中执行此操作,这样异常就不会导致泄漏。

顺便说一句,您评论的代码中有更多复杂性。您使用的 Bitmap 构造函数要求您保持 IntPtr 有效,在不再使用 Bitmap 之前您不能释放内存。所以使用 delete 实际上是无效的。考虑使用 Bitmap.LockBits() 来获取指向管理自己内存的位图的指针。并注意步伐。

于 2011-04-09T19:56:15.570 回答