Page 1 of 1

Memory leak in MagickAnnotateImage

Posted: 2012-08-15T07:35:06-07:00
by franklin.amormino
I am developing an application to capture images from a webcam 3-4 Hz.The processing and written image using the functions MagickConstituteImage and MagickWriteImage are occurring correctly, but when using the function MagickAnnotateImage see what is happening a memory leak.
After a few minutes writing some images there is a break in the system.

Syntax I'm using:
MagickAnnotateImage (mw_destination, dw, 0,image_height, 0, subtitle);
where:
mw_destination is a MagickWand *;
dw is a DrawingWand *;
image_height is a size_t;
subtitle is a const char *;

I am using ImageMagick-6.7.8-Q8.
Does anyone have any information that can help me?
Thank you.

Re: Memory leak in MagickAnnotateImage

Posted: 2012-08-15T07:52:44-07:00
by magick
Post a small complete code set that we can use to reduce the leak. We'll download your code, compile, and run it against a memory debugger to track down any potential leak. Thanks.

Re: Memory leak in MagickAnnotateImage

Posted: 2012-08-15T10:22:25-07:00
by franklin.amormino
I created a small test project in C + + Builder XE2 Update 4, I'm working on my project with C + + Builder. COFF2OMF used to convert the library CORE_RL_wand_.lib. My system is a Windows 7 Professional SP1.

I see that the number of handles increases very fast and the memory used by the process increases.

This is the little code.

Code: Select all

#pragma hdrstop
#pragma argsused
#include <tchar.h>
#include <stdio.h>
#include <windows.h>
#include <string>
#include "wand/magick_wand.h"
#pragma comment( lib, "CORE_RL_wand_.cbuilder.lib" )

#define array_len(v) (sizeof(v)/sizeof((v)[0]))

int save_picture(const char * output_picture_path, const char * subtitle)
{
	int result = 0;
	MagickWandGenesis();
	MagickWand * mw_destination = NewMagickWand();
	DrawingWand * dw = NewDrawingWand();
	PixelWand * pw = NewPixelWand();

	if(( MagickWand * ) NULL != mw_destination) {
		size_t image_width = 640;
		size_t image_height = 480;
		PixelSetColor(pw, "white");
		if( MagickTrue != MagickNewImage( mw_destination, image_width, image_height + 100, pw ) ) {
			result = 1;
		} else {
			DrawSetFontSize(dw, 35);
			PixelSetColor(pw, "black");
			DrawSetFillColor(dw, pw);
			//Annotates the image with text.
			if (MagickTrue != MagickAnnotateImage( mw_destination, dw, 0, image_height + 50, 0, subtitle )) {
				result = 1;
			} else {
				if( MagickTrue != MagickWriteImage( mw_destination, output_picture_path ) ) {
					result = 1;
				}
			}
		}
		DestroyDrawingWand(dw);
		DestroyPixelWand(pw);
		DestroyMagickWand(mw_destination);
	}
	MagickWandTerminus();
	return result;
}

int main()
{
	static const char * camera_test_bmp = "camera.test.bmp";
	SYSTEMTIME st;
	char tmp_out_text [ 1024 ];
	int result;
	printf("Processing...\n");
	while(true){
		GetLocalTime( & st );
		snprintf( tmp_out_text, array_len( tmp_out_text ),
			"%04d/%02d/%02d %02d:%02d:%02d.%03d",
			st.wYear, st.wMonth, st.wDay,
			st.wHour, st.wMinute, st.wSecond,
			st.wMilliseconds );
		if (save_picture(camera_test_bmp, tmp_out_text))
			break;
		Sleep(250);
	}
	return 0;
}
Watching with Process Explorer - Sysinternals, I could conclude that each handle is equivalent to an open registry key.
Have opened hundreds of registry keys:
    HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion

Re: Memory leak in MagickAnnotateImage

Posted: 2012-08-15T11:30:01-07:00
by magick
We tried valgrind, a memory debugger under Linux, and it does not reveal any leaks. The only method that is Windows specific when annotating is NTLoadTypeLists(). So far we can't spot a leak when we inspect this method but we'll investigate further. In the mean-time, try moving MagickWandGenesis() / MagickWandTerminus() from save_picture() to main(). That way it is only called once, instead of once for each picture. Does not stop the leak?

Re: Memory leak in MagickAnnotateImage

Posted: 2012-08-15T12:36:08-07:00
by franklin.amormino
Yes! I deleted MagickWandGenesis()/MagickWandTerminus() and was apparently contained the leak.
I'll let run for a few hours so I can observe the behavior.
Thank you my friend.