MFC类附加GDI位图。是否应该在析构函数中使用DeleteObject和Detach?

时间:2015-12-29 19:37:55

标签: c++ bitmap mfc

我在从CBitmap派生的MFC中有一个名为BitmapTools的类。

在其中,一个函数加载并附加一个Bitmap,如下所示。

bool BitmapTools::LoadAttachBitmap(LPCSTR bmpfile)
{   
    H_Bitmap = (HBITMAP)LoadImage(NULL, bmpfile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
    return Attach (H_Bitmap);   
}

当类超出范围并被销毁时,我是否需要分离位图并调用DeleteObject来释放内存?

我在析构函数中添加了以下内容,但从我读过的内容来看,我不确定是否有必要。

BitmapTools::~BitmapTools()
{
    this->Detach();
    DeleteObject();
}

谢谢,

2 个答案:

答案 0 :(得分:1)

不,你没有 - CBitmap派生自CGdiObject,析构函数如下所示:

_AFXWIN_INLINE CGdiObject::~CGdiObject()
{
    AFX_BEGIN_DESTRUCTOR

        DeleteObject(); 

    AFX_END_DESTRUCTOR
}

DeleteObject();的实施方式如下:

BOOL CGdiObject::DeleteObject()
{
    if (m_hObject == NULL)
        return FALSE;
    return ::DeleteObject(Detach());
}

因此它会分离并删除任何附加的对象。

MFC的所有资源都可以在VS目录中找到,上面的资源来自旧版VS2005,但应该与新版本类似。

您应该能够使用调试器进入类和上层的析构函数 - 只需按F11。

答案 1 :(得分:0)

你不必删除它,你不会有任何记忆或资源泄漏,如果你不,但MS说你应该

MSDN LoadImage function (Remarks section)

所以你做得很好