Leadtools Недостаточно памяти - PullRequest
0 голосов
/ 04 ноября 2019

Мне нужно исправить ошибку, из-за которой функция 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 типа BITMAPHANDLE и Gdiplus::Bitmap. Во-первых, я подумал, что удаление конструктора m_pGdiplusBitmap может помочь, но это не так. Есть ли возможный способ освободить / уменьшить использование графической памяти? Или, по крайней мере, некоторые инструменты для проверки использования графической памяти (я использую Microsoft Visual Studio 2017).

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Как вы узнали, за функциями в LEADTOOLS, которые распределяют пиксельные данные, должен следовать вызов L_FreeBitmap (), когда вам больше не требуется растровое изображение в памяти. Это на самом деле упоминается в разделе справки , который вы упомянули в исходном вопросе , в котором говорится: «Поскольку функция выделяет память для хранения изображения, вы можете освободить эту память, вызвав L_FreeBitmap.»

Размещение вызова L_FreeBitmap может иметь решающее значение для предотвращения утечек памяти. Поскольку пиксельные данные обычно являются самым большим объектом памяти в дескрипторе растрового изображения, неправильное их освобождение может привести к огромным утечкам.

Кроме того, если ваш код выделяет саму структуру BITMAPHANDLE с помощью оператора «new», вам необходимоудалить его, как только закончите с ним. Даже если сама структура обычно намного меньше по размеру, чем пиксельные данные, вы никогда не должны допускать утечку памяти в вашем приложении.

Если у вас возникнут какие-либо проблемы, связанные с функциями LEADTOOLS, не стесняйтесь писать по электронной почтеподробности по адресу нашей службы поддержки support@leadtools.com. Поддержка по электронной почте бесплатна для всех версий инструментария, будь то выпуск (приобретен) или бесплатная оценка.

0 голосов
/ 05 ноября 2019

Хорошо, это утверждение сработало, просто пришлось поместить его в другое место.

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

Все еще возникают проблемы с GdiplusBitmap и загрузкой изображений с расширением .bmp, но это уже что-то другое. Кроме того, в VS2017 вы можете перейти в Debug -> Performance Profiler () ... (Alt + F2), чтобы использовать некоторые инструменты для проверки использования CPU / GPU / Memory.

...