[Lazarus] Buffer dealocating between program and C++ library

Mattias Gaertner nc-gaertnma at netcologne.de
Thu May 12 00:36:34 CEST 2011


On Wed, 11 May 2011 15:35:40 -0300
Leonardo M. Ramé <l.rame at griensu.com> wrote:

> Hi, I'm using a C++ library created by me, with a function that let me get an image buffer. 
> I use that buffer to do some processing, then I can tell the library to delete the buffer.
> 
> In Linux, I never had an issue between my Lazarus program and that
> library, but yesterday I decided to port it to Windows, and found the
> buffer is never deleted, causing a "Microsoft Visual C++ Runtime
> library, runtime error....". The library is compiled with Mingw32.
> 
> After having found the error, I created a C++ program that calls the
> problematic method 1000 times, and noted the memory is handled
> correctly, then I made a simple FPC program that does the same thing,
> and found the same behavior as in Lazarus.
> 
> Here are the signatures for the functions exported by the library:
> 
>   TgetDicomImage = function(const ADicomImage: Pointer; out buffer: Pointer;
>     out bufSize: longint; ALeft, ATop: double; var AWidth, AHeight: double): integer; cdecl;
> 
>   TdeleteBuffer = procedure(ABuffer: PByte); cdecl;
> 
> 
> And here is a snippet of the code I use to test the function:
> 
> 
>   Pointer(lGetDicomImage) := GetProcAddress(lLibHandle, 'getDicomImageBufferEx');
>   Pointer(lDeleteBuffer) := GetProcAddress(lLibHandle, 'deleteBuffer');
> 
>   for I := 0 to 1000 do
>   begin
>     if @lGetDicomImage <> nil then

if lGetDicomImage <> nil then

What mode are you using? Delphi?


>     begin
>       lWidth := 900;
>       lHeight := 400;
>       lBuffer := nil;
>       lBufSize:= 0;
>       if lGetDicomImage(lDicomImage, lBuffer, lBufSize, lLeft, lTop, lWidth, lHeight) = 1 then
>       begin
> 
>         // ---   buffer processing  --
>         // ...
>         // --- end buffer processing --
> 
>         if @lDeleteBuffer <> nil then
>           lDeleteBuffer(lBuffer); // <----- memory keeps increasing here.
>       end;

end;
if lBuffer<>nil then
  lDeleteBuffer(lBuffer);


>     end;
>   end;
> 
> For those interested in the C++ functions:
> 
>   int getImageBufferEx(void * imagen, void * &buffer, unsigned long&
>   bufSize, double left, double top, double &width, double &height)
>   {
>      DicomImageHandler * imgHandler = (DicomImageHandler *)imagen;
>      int lResult = -1;
>      if(imgHandler->getDicomImage()->getStatus() == EIS_Normal)
>      {
>        double lZoom = imgHandler->getZoomFactor();
>        DicomImage * lOrigImage = imgHandler->getDicomImage()->createClippedImage(left, top, width, height, 65535);
>        DicomImage * clippedImage = lOrigImage->createScaledImage(lZoom);
>        width = clippedImage->getWidth();
>        height = clippedImage->getHeight();
>        bufSize = clippedImage->getOutputDataSize();
>        buffer = new Uint16[bufSize];
>        if(clippedImage->getOutputData((void *)(buffer), bufSize, 8))
>          lResult = 1;
>        delete clippedImage;
>        delete lOrigImage;
>      }
>      return lResult;
>   }
> 
> 
>   void deleteBuffer(void * &buffer)
>   {
>     delete [] (Uint16 *)buffer;
>     buffer = NULL;
>   }
> 
> 
> Please, tell me if you find something that can be causing the memory
> leaks.

Mattias




More information about the Lazarus mailing list