在我的程序中,我有以下 typedef:
typedef shared_ptr<IFrameObserver> IFrameObserverPtr;
然后,这行代码:
IFrameObserverPtr myObv(new MyObserver(cameras[0]))
. . . 其中 MyObserver 是在 IFrameObserverPtr 的构造函数中创建的。问题是 MyObserver 类每次创建时都会创建一个 6mB 的位图,并且由于它永远不会被删除,这会导致非常严重的内存泄漏(该行每秒调用 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,但我不知道该怎么做。