Q1.
TClassA = class
end;
TClassB = class
private
Fa: TClassA;
public
constructor Create;
destructor Destroy;
propery a: TClassA read Fa write Fa;
end;
implementation
constructor TClassB.Create
begin
Fa:= TClassA.Create;
end;
destructor TClassB.Destroy
begin
Fa.Free;
end;
이런 식으로 object안에 object를 포함하고 있을 때 외부에서
bClass := TClassB.Create;
aClass := TClassA.Create;
bClass.a := aClass;
이런 식으로 동적으로 a 에 할당했을 때 메모리 누수문제가 어떻게 되는지 궁금합니다.
Q2.
TRecordA = record
a: String;
b: String;
end;
TClassA = class
private
a: TRecordA;
end;
와 같이 Record 타입을 포함한 Instance를 ObjectList에 사용했을 때 문제가 없는가 해서요.
Q3. D7를 쓰고 있는데요, 혹시 ObjectList가 object를 자동 해제 해 줄 수 있듯이 Record 타입을 list에 집어넣어도 자동해제해 줄 수 있는 class 같은 것이 있나 해서요. TList를 사용하면 메모리 할당, 해제를 잘 해주어야 하고, TCollection을 쓰면 필요한 데이터 구조를 만드는 작업이 꽤 성가진 작업이 되는 것 같네요. 그래서 Record 타입을 선언하고 그걸 List에 손쉽게 처리하고 싶습니다. 그런 방법이 있는지 궁금합니다.
Q1) 누수가 됩니다. Create시 생성한 ClassA가 해제가 안되니까요. 누수를 방지할려면 property A의 set method를 아래와 같이 바꾸세요.
private
procedure SetA(Value: TClassA);
public
propery a: TClassA read SetA write FA;
end;
implementation
procedure TClassB.SetA(Value: TClassA);
begin
if Assigned(FA) then
FA.Free;
FA := Value
end;
Q2) 전혀 문제 없습니다.
Q3) TList에서 파생해서 새로운 객체를 만들어서 쓰세요. TList의 Notification메소드만 override해서 쓰시면 자동해제가 가능합니다.