IntPtr вызывает утечку памяти? - PullRequest
3 голосов
/ 09 апреля 2011

Эта функция находится в цикле.Когда я запускаю программу, строка с 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 Ответ

2 голосов
/ 09 апреля 2011

Довольно печально, что этот код компилируется, но это сделано специально.Оператор удаления, примененный к управляемому типу, фактически не освобождает память.Он вызывает метод IDisposable :: Dispose () для переданного объекта.Довольно печально, что это даже работает, IntPtr упаковывается, чтобы превратить его в объект, а затем проверяется, реализует ли он интерфейс IDisposable.Конечно, ничего не происходит.

Вы должны передать указатель, полученный вами от оператора new .Не забудьте сделать это в блоке finally, чтобы исключение не могло вызвать утечку.

Кстати, в коде, который вы прокомментировали, есть больше сложностей.Используемый вами конструктор Bitmap требует, чтобы IntPtr был действительным, вы не можете освободить память, пока Bitmap больше не используется.Поэтому использование delete на самом деле недопустимо.Попробуйте вместо этого использовать Bitmap.LockBits (), чтобы получить указатель на растровое изображение, которое управляет собственной памятью.И остерегайтесь шагов.

...