我的问题是关于调试似乎是一场噩梦的内存泄漏。
在我的应用程序中有一个简单的类派生自TObject
. 该类的所有对象都存储在派生自的类的集合/列表中TObjectList
:
type
TOffer = class(TObject)
Item: string;
Price: string;
Id: string;
end;
TOffers = class(TObjectList<TOffer>)
protected
procedure SetOffer(I: Integer; AOffer: TOffer);
function GetOffer(I: Integer): TOffer;
public
property Offers[I: Integer]: TOffer read GetOffer write SetOffer
end;
使用场景:
爬虫下载商品,解析并保存到对象集合中。这种方法似乎很方便,因为我可以稍后引用对象(填充网格/列表,将它们写入文件等)
问题是正确处理对象以避免内存泄漏。该应用程序在启动时分配 ~4Mb 内存,但处理后 ~12k 提供它吞噬 32Mb。进程完成后未正确处理的对象/变量导致的泄漏。
ReportMemoryLeaksOnShutdown
显示可怕的数字,但关键是 - 我不知道在哪里看以及如何正确调试该死的东西。
var MyString: string
另一个例子是也需要适当处理的变量!这对我来说是一种洞察力:) 我认为每个过程/函数都会自动管理范围外变量的垃圾收集。
报价列表由一个函数创建:
function GetOffersList: TOffers;
begin
Result := TOffers.Create;
while not rs.EOF do
begin
Offer := TOffer.Create;
try
// here come collected offer attributes as variables of type string:
Order.Item := CollectedOfferItem;
Order.Price := CollectedOfferPrice;
Order.Id := CollectedOfferId;
Result.Add(Offer);
finally
Offer := nil;
end;
end;
end;
然后我直接将这些报价作为一个集合来处理。关键是我希望这个应用程序 24/7 运行,所以正确的资源处理是必须的。
- 如何正确处置上述类型的对象?
- 我应该考虑管理对象/对象列表的其他技术吗?
- 如何正确处理类型变量
string
? - 您能否建议有关在 Delphi 中对抗内存泄漏的好读物?
谢谢你。