0

我必须纠正 Leadtools 函数“L_LoadBitmap() 返回 ERROR_NO_MEMORY”的错误,您可以在此处找到有关它的更多信息。我正在开发的应用程序必须能够处理图像,无论每个图像的大小或数量如何。这里调用函数:

HENHMETAFILE hemf = 0;
BITMAPHANDLE bmh = {0}; 
    hemf = LoadMetaFile( (LPCTSTR)strPath, hDC ); 
    if ( !hemf )
    {
        memset( &bmh, 0, sizeof(BITMAPHANDLE) );
        L_INT nResult = 0;

        nResult = L_LoadBitmap( const_cast<LPTSTR>( (LPCTSTR)strPath ), &bmh, 0, ORDER_BGR );

        if ( nResult != SUCCESS )
        {
            MFDebugString( DL_FORMULAR, __FUNCTION__ "( %s ): Can't load background file via L_LoadBitmap (%d)\n", (LPCTSTR)strPath, nResult );
            return nullptr;
        }
    }
pOrigBg = std::make_shared<CBackgroundImage>(strPath, hemf, bmh);
m_ImageCache[strKey.GetString()] = pOrigBg;
return pOrigBg;

pOrigBg是一个以std::shared_ptr<CBackgroundImage>这种方式构造的对象:

NxFE::CBackgroundImage::CBackgroundImage(LPCTSTR strPath, HENHMETAFILE emf, const BITMAPHANDLE& bmp)
    : m_Filename(strPath), m_Metafile(emf), m_pLeadBitmap(new BITMAPHANDLE(bmp)),
    m_pGdiplusBitmap(NxClass::Win32::GDIPlus::CreateBitmapFromFile((LPCSTR) m_Filename))
{
}

你怎么能看到,pOrigBg包含一个 std::unique_ptr 类型BITMAPHANDLEGdiplus::Bitmap. 首先,我认为删除 m_pGdiplusBitmap 的构造函数可能会有所帮助,但事实并非如此。是否有任何可能的方法来释放/减少图形内存的使用?或者至少是一些检查图形内存使用情况的工具(我使用的是 Microsoft Visual Studio 2017)。

4

2 回答 2

1

正如您所发现的,当您不再需要内存中的位图时,必须在 LEADTOOLS 中分配像素数据的函数之后调用 L_FreeBitmap()。这实际上是在您在原始问题中提到的帮助主题中提到的,其中指出:“由于该函数分配存储空间来保存图像,因此您可以通过调用 L_FreeBitmap 来释放此存储空间。”</p>

L_FreeBitmap 调用的位置对于避免内存泄漏至关重要。由于像素数据通常是位图句柄中最大的内存对象,因此未能正确释放它可能会导致大量泄漏。

此外,如果您的代码使用“new”运算符分配 BITMAPHANDLE 结构本身,则需要在完成后将其删除。即使结构本身的大小通常比像素数据小得多,您也不应该在应用程序中允许任何类型的内存泄漏。

如果您遇到任何与 LEADTOOLS 功能相关的问题,请随时将详细信息通过电子邮件发送到我们的支持地址 support@leadtools.com。电子邮件支持对工具包的所有版本都是免费的,无论是发布(购买)还是免费评估。

于 2019-11-05T19:28:44.820 回答
0

好的,这个声明有效,只是必须把它放在不同的地方

if ((bmh).Flags.Allocated)
                L_FreeBitmap(&bmh);

GdiplusBitmap 和加载带有 .bmp 扩展名的图像仍然存在问题,但这已经是另一回事了。此外,在VS2017中,您可以转到 Debug -> Performance Profiler()... (Alt+F2) 使用一些工具来检查 CPU / GPU / 内存使用情况。

于 2019-11-05T13:27:09.147 回答