Memory IntPtr导致内存泄漏?

Memory IntPtr导致内存泄漏?,memory,c++-cli,memory-leaks,intptr,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

此函数处于循环中。当我运行程序时,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

这段代码编译起来很遗憾,但这是出于设计。应用于托管类型的delete运算符实际上不会释放任何内存。它对传递的对象调用IDisposable::Dispose()方法。令人遗憾的是,这甚至可以工作,IntPtr被装箱以将其转换为对象,然后检查它是否实现IDisposable接口。当然没有,什么也没发生

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


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

你至少能说一下这是什么语言和平台吗?是的,这是c++\cli我认为问题可能是由“新”引起的,但不知何故,我无法删除分配的memoryIntPtr ip(新的无符号字符[img->widthStep*img->height]);//每次此行执行时都会占用更多内存执行
unsigned char*c=new unsigned char[img->widthStep*img->height];IntPtr ip(c);/*废话废话*/;删除c显示相同的行为?如何传递从新运算符返回的指针?你能给我看一些片段吗,谢谢你,阿洛特马丁霍已经给你看了。注意我添加的段落。是的,就像你说的,在更改为Martinho建议的代码后,内存问题得到了解决,但是我的picturebox无法正确加载。lockbits?你能用LockBits()显示一个片段吗?我真的不明白你的最后两句话MSDN库中有一个很好的例子。我们只是把合适口径的子弹交给你。把枪对准你的脚是你的工作。