Leadtools没有足够的可用内存

我必须纠正一个Leadtools函数“ L_LoadBitmap()返回ERROR_NO_MEMORY”的错误,有关它的更多信息,您可以找到Here。 尽管每个图像的大小或计数,我正在处理的应用程序都必须能够处理图像。 这里的函数称为:

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

        nResult = L_LoadBitmap( const_cast<LPTSTR>( (LPCTSTR)strPath ),&bmh,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包含类型为BITMAPHANDLEGdiplus::Bitmap的std :: unique_ptr。 首先,我认为删除m_pGdiplusBitmap的构造函数可能有帮助,但没有帮助。 有什么可能的方法来释放/减少图形内存的使用?或者至少是一些检查图形内存使用情况的工具(我正在使用microsoft Visual Studio 2017)。

wjqact 回答:Leadtools没有足够的可用内存

好的,此语句有效,只需将其放在其他位置

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

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

,

正如您所发现的,当您不再需要内存中的位图时,在LEADTOOLS中分配像素数据的函数必须调用L_FreeBitmap()。 help topic you mentioned in your original question中实际上提到了这一点,它指出:“由于该函数分配了存储空间来保存图像,因此您可以通过调用L_FreeBitmap释放此存储空间。”

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

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

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

本文链接:https://www.f2er.com/3166471.html

大家都在问