私のプログラムには、次の typedef があります。
typedef shared_ptr<IFrameObserver> IFrameObserverPtr;
そして、後で、このコード行:
IFrameObserverPtr myObv(new MyObserver(cameras[0]))
. . . MyObserver は IFrameObserverPtr のコンストラクターで作成されます。問題は、MyObserver クラスが作成されるたびに 6mB のビットマップを作成し、削除されないため、かなり深刻なメモリ リークが発生することです (この行は 1 秒間に 10 回呼び出されます)。
私の質問は短くて簡単です。新しい MyObserver を明示的に削除して、このメモリ リークから身を守るにはどうすればよいですか?
私のメモリ リークがどれほどひどいものであるかについての参考として、プログラムの部分実行中のタスク マネージャを次に示します。
編集:さて、私はこれを無駄に修正しようとして過去2時間を費やしました. やってます。. .
myObv.reset();
. . . うまくいきませんでした。
誰でも MyObserver クラス内で何が起こっているかを確認できるように、次のようにします。
class MyObserver : public IFrameObserver
{
public:
HBITMAP hbm;
BITMAPINFOHEADER* bi;
MyObserver(CameraPtr pCamera) : IFrameObserver(pCamera) {};
~MyObserver(){delete hbm;}
HBITMAP GetBMP()
{
return hbm;
}
void FrameReceived ( const FramePtr pFrame )
{
DbgMsg(L"Frame Received\n");
//////////////////////////////////////////////////////////////////////////
////////// Set Bitmap Settings ////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//fileheader
BITMAPFILEHEADER* bf = new BITMAPFILEHEADER;
bf->bfType = 0x4d42;
bf->bfSize = 6054400 + 54;
bf->bfOffBits = 54;
//infoheader
bi = new BITMAPINFOHEADER;
bi->biSize = 40;
bi->biWidth = 2752;
bi->biHeight = -733;
bi->biPlanes = 1;
bi->biBitCount = 24;
bi->biCompression = 0;
bi->biSizeImage = 6054400;
bi->biXPelsPerMeter = 2835;
bi->biYPelsPerMeter = 2835;
bi->biClrUsed = 0;
bi->biClrImportant = 0;
//image data in VmbPixelFormatMono8
VmbUchar_t* imageData;
pFrame->GetImage(imageData);
//////////////////////////////////////////////////////////////////////////
////////// Output File to .bmp ////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
BITMAPINFO* bmi;
bmi = (BITMAPINFO*)bi;
HDC hdc = ::GetDC(NULL);
hbm = CreateDIBitmap(hdc, bi, CBM_INIT, imageData, bmi, DIB_RGB_COLORS);
delete bf;
delete bi;
//free(imageData); //doesn't work, crashes
//delete imageData; //doesn't work, crashes
imageData = NULL; //doesn't crash, but I don't think this frees the memory
DeleteObject(hdc);
}
};
このオブジェクトが作成されたときに作成される 5.77 mB を解放するために考えられるすべてのことを試しましたが、その方法がわかりません。