Theo FastMM4, chương trình Delphi tôi đang làm việc vào lúc này đang bị rò rỉ nhiều chuỗi. AnsiStrings để được chính xác:Ứng dụng Delphi bị rò rỉ AnsiStrings
Đơn đề nghị (http://sourceforge.net/projects/orwelldevcpp/) được sử dụng để rò rỉ rất nhiều kiểu dữ liệu khác, nhưng FastMM4 có thể báo cáo nơi dụ đã được tạo ra, vì vậy tôi cố gắng khắc phục điều đó. Điều kỳ lạ là FastMM4 không báo cáo vị trí của những rò rỉ này.
Chỉnh sửa: có vẻ như sau cùng, hãy xem câu trả lời cho bản sửa lỗi. Dù sao thì, câu hỏi vẫn còn là: thế nào tôi đang rò rỉ những thứ này?
Vì vậy, ehm, thật không may, tôi không biết nên tìm gì. Ý tôi là, nếu những thứ này vượt ra khỏi phạm vi, chúng sẽ tự động được giải phóng ngay (mặc dù chúng nằm trên đống)?
Tôi đã quản lý theo dõi một vài rò rỉ bằng cách nhận xét ngẫu nhiên và xem điều gì sẽ xảy ra với số lượng. Dưới đây là một ví dụ:
// simply passing it a constant creates a leak...
MainForm.UpdateSplash('Creating extra dialogs...');
procedure TMainForm.UpdateSplash(const text : AnsiString);
begin
if not devData.NoSplashScreen then // even if this branch is NOT taken
SplashForm.Statusbar.SimpleText := 'blablabla' + text;
end;
// And even if the function call itself is placed within a NOT taken branch!
Dưới đây là một ví dụ về một sự rò rỉ:
// Passing this constants produces leaks...
procedure TCodeInsList.AddItemByValues(const a, b, c: AnsiString;...);
var
assembleditem : PCodeIns;
begin
new(assembleditem);
assembleditem^.Caption:=a;
assembleditem^.Line:=b;
assembleditem^.Desc:=c;
...
fList.Add(assembleditem);
end;
// ... even when calling this on WM_DESTROY!
destructor TCodeInsList.Destroy;
var
I: integer;
begin
for I := 0 to fList.Count - 1 do
Dispose(fList[I]);
fList.Free;
inherited Destroy;
end;
// produces leaks!?
Có khá một loạt các câu hỏi chuỗi rò rỉ ở đây, nhưng không ai thực sự làm rõ những gì mô hình ta nên tìm kiếm. Google cũng không cung cấp.
Chỉnh sửa: vì vậy, tôi phải tìm các hằng số được chuyển. Nhưng tại sao?
Vì vậy, ehm, có ý tưởng nào không?
Tôi không thể tải dự án sourceforge vào lúc này. Có khả năng rằng hình thức chính không bị phá hủy đúng cách và do đó để lại chuỗi lủng lẳng? Điều đó có làm được không? –
delphi phiên bản?Nếu bạn có thể, kiểm tra với aqtime nó sẽ cho bạn biết chính xác nơi rò rỉ là. –
@RichardA: Như bạn có thể thấy trong nguồn \ devcpp.dpr, hình dạng giật gân được giải phóng bằng cách sử dụng 'Miễn phí'. Sẽ thử thêm caFree vào sự kiện OnClose. @ Warren: Tôi rất nghi ngờ aqtime sẽ có thể cho tôi biết nhiều hơn FastMM4, gpProfiler và MemCheck. Và tôi cần phải nâng cấp lên XE quá cho aqtime (bằng cách sử dụng D7 bây giờ). Trường đại học của tôi có một giấy phép D2009 nổi xung quanh một nơi nào đó (không phải cho các folks EE như tôi mặc dù), nhưng aqtime thậm chí không hỗ trợ rằng nó có vẻ. –
Orwell