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

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

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();
}

谢谢,

最佳答案

不,您不必-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());
}

因此它会分离并删除所有附加对象。

VS目录中提供了MFC的所有源,以上源均来自旧版本VS2005,但应与较新的源相似。

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

08-20 01:42