【问题标题】:Leadtools Not enough memory availableLeadtools 没有足够的可用内存
【发布时间】:2019-11-04 13:19:17
【问题描述】:

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

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&lt;CBackgroundImage&gt;对象,以这种方式构造:

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)。

【问题讨论】:

  • 我正在开发的应用程序必须能够处理图像,无论每个图像的大小或数量如何。 -- 你的应用程序是 64 位还是 32 位?如果它是 32 位,那么你的工作就处于劣势。
  • @PaulMcKenzie 它是 32 位的..
  • 那么你的内存限制为 2GB。如果您必须在内存中处理这么大的图像,您应该考虑使用 64 位。
  • @PaulMcKenzie 我尝试在一个新的 32 位环境 windows 应用程序中使用这个工具,它与我用于测试主应用程序的相同图像正常工作。但客户端只使用 32 位环境和大尺寸图像。这就是为什么我要问是否有任何方法可以为这种情况释放内存。我也尝试了 L_ReleaseBitmap() 和 L_FreeBitmap() 但图像仍然无法加载到一定数量。

标签: c++ visual-studio-2017 leadtools-sdk


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    好的,这个语句有效,只是需要把它放在不同的地方

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多