tôi đã gặp lỗi khác trong ứng dụng do sử dụng bất cẩn giao diện Delphi. Khi tôi truyền một giao diện đến một thủ tục bỏ qua đối số đó, cá thể đó sẽ không bao giờ được giải phóng. Xem ví dụ đơn giản sau:Tham chiếu giao diện không sử dụng không bị phá hủy
ITest = interface
procedure Test;
end;
Tester = class(TInterfacedObject, ITest)
public
procedure Test;
end;
Base = class
public
procedure UseTestOrNot(test : ITest); virtual; abstract;
end;
A = class(Base)
public
procedure UseTestOrNot(test : ITest); override;
end;
B = class(Base)
public
procedure UseTestOrNot(test : ITest); override;
end;
{ A }
procedure A.UseTestOrNot(test: ITest);
begin
test.Test();
end;
{ B }
procedure B.UseTestOrNot(test: ITest);
begin
WriteLn('No test here');
end;
// -------- Test ---------------------------------------
var
list : TObjectList<Base>;
x : Base;
t : ITest;
begin
ReportMemoryLeaksOnShutdown := true;
list := TObjectList<Base>.Create;
list.Add(A.Create);
list.Add(B.Create);
// 1 x Tester leak for each B in list:
for x in list do
x.UseTestOrNot(Tester.Create);
// this is ok
for x in list do
begin
t := Tester.Create;
x.UseTestOrNot(t);
end;
list.Free;
end.
Bạn có thể giải thích điều gì xảy ra với bộ đếm tham chiếu không? Bạn có thể đưa ra bất kỳ hướng dẫn/hướng dẫn nào tốt nhất (như "Không bao giờ tạo ra một cá thể giao tiếp bên trong một cuộc gọi hàm [nếu bạn không biết điều gì xảy ra bên trong]"
Giải pháp tốt nhất tôi có thể nghĩ là viết một phương pháp mẫu trong lớp cơ sở đó giúp tiết kiệm phân biển kiểm tra thông qua và kêu gọi một DoUseTestOrNot
phương pháp trừu tượng.
EDIT Delphi 2010
Phiên bản Delphi này là gì? –
xin lỗi, đó là Delphi 2010 – hansmaad
Không quan trọng, đó là lỗi bất kể phiên bản. chờ cho đến khi delphi cũ 2? Chúc mừng – APZ28