gpt4 book ai didi

memory - IntPtr 导致内存泄漏?

转载 作者:行者123 更新时间:2023-12-01 10:35:38 27 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

关于memory - IntPtr 导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5607318/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com