Memory Leak in Memo Field

Posted by jboden on  2002-07-18 11:05:00

There is a memory leak that fails to release memory assigned when a memo buffer is released. In the existing code, the memory is only released if the memo contents are changed.


status: CLOSED    Urgency: MEDIUM    As Of: 2002-07-18 11:05:00

Comment:

Replace the following method in Halcn6db.pas:

destructor THCBlobStream.Destroy;
var
   msiz: longint;
begin
   try
      if FModified and (FDataset.State in [dsEdit, dsInsert]) then
      begin
         FDataset.SetCurRecord(FDataSet.ActiveBuffer);
         if FMemory = nil then
         begin
            GetMem(FMemory,4);   
            FMemory[0] := #0;     
            FMemorySize := 3;     
            FPosition := 0;       
            msiz := 0;            
         end
         else
         begin
            msiz := Size;
            if FField.Transliterate then
            begin
               FDataSet.Translate(FMemory, FMemory, True);
            end;
         end;
         FDataSet.DBFHandle.gsMemoSaveN(FFieldNo, FMemory, msiz);
         FDataSet.RestoreCurRecord;
         FField.Modified := True;
         FDataSet.DataEvent(deFieldChange, Longint(FField));
      end;
   finally
      if FMemory <> nil then
      begin
         FreeMem(FMemory,FMemorySize+1);
         FMemorySize := 0;
         FPosition := 0;
         FMemory := nil;
      end;
   end;
end;