여기 까다로운 상황이 있습니다. 나는 레코드의 필드 인 객체를 해제 할 수 있어야합니다. 일반적으로 소멸자에 클린업 코드를 작성합니다 (클래스 인 경우). 그러나 레코드 유형은 "소멸자"를 도입 할 수 없으므로 어떻게 호출 할 수 있습니까? TObject (Field) .Free;? 를 새 기록을 교체레코드에있는 오브젝트를 해제하는 방법은 무엇입니까?
:
두 사용의 유형 I 예측이있을 수 있습니다.
이 사용법은 쉽게 구현할 수 있다고 생각합니다. 레코드는 값 유형이므로 할당시 복사되므로 할당 연산자가 오버로드되어 이전 레코드가 소유 한 객체를 해제 할 수 있습니다.
(편집 : 할당 오버로드는 수 없습니다 그것은 나에게 새로운 정보입니다 ....)
레코드 변수가 정의 된 범위를 종료.
개체를 비우는 개인 메서드가 있다고 생각할 수 있습니다.이 메서드는 범위 여기를 수동으로 호출 할 수 있습니다. 하지만 여기에 같은 질문이 있습니다 : 더 많이 만드는 방법 녹음?
FAdditionalData:=TList<Pointer>.Crete;
라고
TProperties = record ... some other spesific typed fields: Integers, pointers etc.. FBaseData: Pointer; FAdditionalData: TList<Pointer>; //FAdditionalData: array of Pointer; this was the first intended definition end;
가 가정 :이 동작은 가지 여기
procedure TFormX.ButtonXClick(Sender: TObject);
var
rec: TProperties;
begin
//rec:=TProperties.Create(with some parameters);
rec.FAdditionalData:=TList<Pointer>.Create;
//do some work with rec
end;
레코드에있는 모든 개체 참조 인 경우 ButtonClick 상기 녹화 더 이상 범위하지만 TList를 여전히 메모리 누수 원인의 실존을 유지 ...
레코드 할당을 오버로드 할 수 없습니다. – kludg
나는 (이전에는 절대로 필요하지 않은) 그것을 깨닫지 못했다. 그러나 나는 지금 그것을 배웠다. :) 그래, 그것은 과부하가 될 수 없었다. ... –