SASGIS

Веб-картография и навигация


View Issue Details Jump to Notes ] Issue History ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0001273SAS.Планета[All Projects] Багpublic12-04-2012 16:4610-10-2012 11:47
Reporterzed 
Assigned Tovdemidov 
PrioritynormalSeverityminorReproducibilityalways
StatusclosedResolutionfixed 
PlatformWindowsOSXPOS VersionSP3
Product Version.Nightly 
Target Version120808Fixed in Version120808 
Summary0001273: Утечка памяти в билде 5373 от 12.04.2012
DescriptionЗапускаем, ничего не трогаем. Закрываем -> утечка.
TagsNo tags attached.
Attached Files? file icon SASPlanet.Debug.elf [^] (6,615 bytes) 12-04-2012 16:46

- Relationships

-  Notes
(0006426)
zed (manager)
13-04-2012 07:35

Похоже, что утечки появились из-за глобальной расстановки const у интерфейсных параметров.

К примеру, при такой передаче интерфейса в функцию:

TEnumDoublePointLonLatToMapPixel.Create(
  AProjection.Zoom,
  AProjection.GeoConverter,
  TEnumLonLatPointFilterFirstSegment.Create(
    AEnum
  )
)

получаем Memory Leak: Type=TEnumLonLatPointFilterFirstSegment;
(0006427)
vdemidov (manager)
13-04-2012 08:41
edited on: 13-04-2012 08:42

Даже не знаю, что с этим делать.
Убирать Const как-то некрасиво. А заводить локальную переменную на каждый такой конструктор странно.

(0006429)
zed (manager)
13-04-2012 10:52

The only issue I know of with the const interface format is as follows:

procedure DoSomething(i:Inknown);
begin
end;

procedure DoSomethingConst(const i:Inknown);
begin
end;

procedure DoSomethingConst2(const i:Inknown);
begin
DoSomething(i);
i.DoSomethingElse; //1
end;

procedure Main;
var
  o1:TInterfacedObject;
begin
o1 := TInterfacedObject.Create;
//2
DoSomething(o1);
//3
o1.DoSomethingElse;

o1 := TInterfacedObject.Create;
//4
DoSomethingConst(o1);
o1.DoSomethingElse; //Succeeds
o1.Free; //Required

At //2 the Compiler automatically adds an AddRef before calling the
procedure and a _Release after which in turn calls Destroy

//3 Fails because o1 has been destroyed.

At //4 the Compiler does not do AddRef or _Release calls so Destroy is
never called.

Of course this can be hidden:
DoSomething( TInterfacedObject.Create);
The object is released after the call

DoSomethingConst( TInterfacedObject.Create);
The object is not released after the call and there is a memory leak.

DoSomethingConst2( TInterfacedObject.Create);
The object is unexpectedly released after the call to DoSomething and
line //1 fails.
(0006430)
zed (manager)
13-04-2012 10:54

Так что const у интерфейсов нужно расставлять очень осторожно.

Сейчас показывает утечку даже здесь:

function TLonLatPolygonLine.GetEnum: IEnumLonLatPoint;
begin
  Result := TEnumDoublePointBySingleLonLatLine.Create(Self, True, @FPoints[0], FCount);
end;

Memory Leak: Type=TEnumDoublePointBySingleLonLatLine
(0006431)
vdemidov (manager)
13-04-2012 11:01

Оно то так. Но ведь если внутри DoSomethingConst будет присваивание в глобальную переменную, то все должно быть нормально. Тоесть объект удалится после обниливания глобальной переменной. А в нашем случае этого не происходит.
(0006432)
vdemidov (manager)
13-04-2012 11:11

Простейший пример:

type
  TTestObj = class
  private
    FI: IInterface;
  public
    constructor Create(const AI: IInterface);
  end;
{ TTestObj }

constructor TTestObj.Create(const AI: IInterface);
begin
  FI := AI;
end;

var
  VObj: TTestObj;
begin
  try
    VObj := TTestObj.Create(TInterfacedObject.Create);
    VObj.Free;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.

Все нормально никаких утечек.
Блин. Я кажись понял в чем дело.
(0006433)
zed (manager)
13-04-2012 11:26

Т.е. в этом конкретном случае внутрях небыло присвоения интерфейса?
(0006434)
vdemidov (manager)
13-04-2012 11:46

Ага. Именно. Было просто использование Enum-а.

- Users who viewed this issue
User List Anonymous (2233x)
Total Views 2233
Last View 21-11-2024 13:13

- Issue History
Date Modified Username Field Change
12-04-2012 16:46 zed New Issue
12-04-2012 16:46 zed File Added: SASPlanet.Debug.elf
12-04-2012 16:47 zed Summary Утечка памяти в билде 5337 => Утечка памяти в билде 5373 от 12.04.2012
13-04-2012 07:35 zed Note Added: 0006426
13-04-2012 08:41 vdemidov Note Added: 0006427
13-04-2012 08:42 vdemidov Note Edited: 0006427 View Revisions
13-04-2012 10:52 zed Note Added: 0006429
13-04-2012 10:54 zed Note Added: 0006430
13-04-2012 11:01 vdemidov Note Added: 0006431
13-04-2012 11:11 vdemidov Note Added: 0006432
13-04-2012 11:19 vdemidov Status new => resolved
13-04-2012 11:19 vdemidov Fixed in Version => 120808
13-04-2012 11:19 vdemidov Resolution open => fixed
13-04-2012 11:19 vdemidov Assigned To => vdemidov
13-04-2012 11:26 zed Note Added: 0006433
13-04-2012 11:46 vdemidov Note Added: 0006434
14-05-2012 08:31 vdemidov Target Version => 120808
10-10-2012 11:47 Tolik Status resolved => closed



Copyright © 2007 - 2024 SAS.Planet Team