2011-04-09 4 views
3

이 함수는 반복됩니다. 내가 프로그램을 실행할 때, IntPtr이있는 라인이 나에게 메모리 문제를주고있다, 나는 delete []를 넣었다. 그러나 여전히 메모리 문제를 해결하지 못한다. 아무도 도와 줄 수 없다? 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이 코드는 컴파일 오히려 슬픈

+1

언어 및 플랫폼이 무엇인지 적어도 말할 수 있습니까? –

+0

음, 이건 C++ \ cli – Qmage

+1

* 메모리에 문제가 있습니까? –

답변

2

이지만, 그 디자인입니다. 관리되는 형식에 적용된 삭제 연산자는 실제로 메모리를 해제하지 않습니다. 전달 된 개체에 대해 IDisposable :: Dispose() 메서드를 호출합니다. 이것은 오히려 슬픈 일이며, IntPtr은 객체로 변환 한 다음 IDisposable 인터페이스를 구현하는지 확인하기 위해 상자에 넣습니다. 물론, 아무 일도 일어나지 않습니다.

연산자에서 가져온 포인터를 전달해야합니다. finally 블록에서이 작업을하는 것을 잊지 마십시오. 예외로 인해 누수가 발생할 수 없습니다.

Btw, 귀하가 댓글을 작성한 코드에 더 많은 복잡성이 있습니다. 사용하는 비트 맵 생성자를 사용하려면 IntPtr을 유효하게 유지해야하며 비트 맵이 더 이상 사용되지 않을 때까지 메모리를 해제 할 수 없습니다. 그래서 delete를 사용하는 것은 실제로 유효하지 않습니다. Bitmap.LockBits()를 대신 사용하여 자체 메모리를 관리하는 Bitmap에 대한 포인터를 얻는 것이 좋습니다. 보폭에 조심하십시오.

+0

어떻게하면 새로운 연산자에서 가져온 포인터를 전달합니까? 일부 스 니펫을 보여 주시겠습니까, 고마워요. – Qmage

+0

Martinho가 이미 당신을 보여 줬습니다. 내가 추가 한 단락에주의를 기울이십시오. –

+0

예, 말했듯이 Martinho가 제안한 코드로 변경된 후 메모리 문제는 해결되지만 대신 내 Picturebox를 제대로로드 할 수 없습니다. – Qmage

관련 문제