IntPtr导致内存泄漏?

时间:2011-04-09 19:32:07

标签: memory c++-cli memory-leaks intptr

此功能处于循环中。当我运行程序时,使用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

1 个答案:

答案 0 :(得分:2)

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

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

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