TInterfacedObject 파생 클래스의 인스턴스가 소멸되고 누가 소멸자를 호출하는지 궁금합니다. ScopedLock 클래스를 작성했습니다. ScopedLock 클래스는 인스턴스가 범위를 벗어날 때 자동으로 동기화 메서드의 메서드를 호출해야합니다. C++에서 알려진 RAII 개념이지만 잠금 인스턴스가 범위를 벗어날 때 소멸자가 호출되도록 보장되는지 여부는 알 수 없습니다.TInterfacedObject.Destroy (ScopedLock 클래스)가 호출 된시기
ILock = interface
end;
ScopedLock<T: TSynchroObject> = class(TInterfacedObject, ILock)
strict private
sync_ : T;
public
constructor Create(synchro : T); reintroduce;
destructor Destroy;override;
end;
implementation
{ ScopedLock<T> }
constructor ScopedLock<T>.Create(synchro: T);
begin
inherited Create;;
sync_ := synchro;
sync_.Acquire;
end;
destructor ScopedLock<T>.Destroy;
begin
sync_.Release;
inherited;
end;
{ Example }
function Example.Foo: Integer;
var
lock : ILock;
begin
lock := ScopedLock<TCriticalSection>.Create(mySync);
// ...
end; // mySync released ?
간단한 테스트 케이스에서는 문제가 없지만 안전합니까?
좋은 기사 .. 델파이 컴파일러가 어떻게 함수를 인라인하기로 결정했는지 말해 줄 수 있습니까? 인라인을 방지/시행 할 수있는 방법이 있습니까? – hansmaad
@hansmaad : {$ INLINE AUTO}가 활성화되어 있지 않으면 인라인 명령으로 표시되지 않은 함수를 자동으로 인라인하지 않습니다. 그러나 $ INLINE AUTO는 매우 똑똑한 휴리스틱을 사용하지 않습니다. 이는 특정 크기 이하의 모든 함수를 인라인 할 것이고 쉽게 크기 폭발을 일으킬 수 있습니다. 즉, $ INLINE AUTO가 적용되지 않을 가능성이 있습니다. 따라서 프로 시저 헤더의 끝에있는 'inline'지시문을 사용하여 인라이닝 할 함수를 직접 표시하면 걱정할 필요가 있습니다. –