Guten Tag,
Ich habe hier ein MemoryLeakOnShutdown das verursacht wird wenn ich ein
Abort;
and der kommentierten Stelle mache. Wenn ich das Abort auskommentiere verschwindet das MemoryLeak.
Naja der Code Block ist sowieso abgearbeitet also könnte ich das Abort weglassen.
Wenn aber durch eine Änderung noch mehr Code hinzukommt, komme ich um das Abort nicht herum da es sich um einen Fehler handelt, und die Routine abgebrochen werden soll.
Zitat:
13-20 bytes: Unknown x1
37-44 bytes: Unknown x1
69-76 bytes: TStringList x1
85-92 bytes: UnicodeString x2
93-100 bytes: UnicodeString x2
Warum entsteht hier ein MemoryLeak ?
Delphi-Quellcode:
procedure TMail.sendMassMail(_from, _subject: String; _delayInSeconds:Int64);
var i: Integer;
msg: TIdMessage;
begin
try
if not isFileEmpty(AppPath+mailListFilePath) then
begin
mailListText := TStringList.Create;
mailListText.LoadFromFile(AppPath+mailListFilePath);
for i := mailListText.Count-1 downto 0 do
begin
if Trim(mailListText[i]) = '' then
begin
mailListText.Delete(i);
end
else
begin
mailListText[i] := Trim(mailListText[i]);
end;
end;
end
else
begin
ShowMessage('MailListe ist leer. Abbruch!');
abort;
end;
if mailListText.Count < 1 then
begin
ShowMessage('Keine Empfänger in der MailListe. Abbruch!');
abort;
end;
if mailInit(_from,_subject) then
begin
if (mailListText.Count > 0) and (mailListText.Count < autoMailMaxCount) then
begin
msg := prepareMailMsg(_from,_subject);
for i := 0 to mailListText.Count-1 do
begin
if (i mod autoMailPackageSendSize = 0) and (i <> 0) then
begin
Sleep(_delayInSeconds*1000);
sendMail(mailListText[i],msg);
end
else
begin
sendMail(mailListText[i],msg);
end;
end;
end
else
begin
Showmessage('EMails können nicht an mehr als ' + IntToStr(autoMailMaxCount)+
' Empfänger gesendet werden.'+#13#10+'Zu viele Empfänger in der Liste. Abbruch!' );
abort; // Dieses Abort verursacht das MemoryLeak, die anderen sind noch nicht getestet!
end;
end;
finally
FreeAndNil(msg);
FreeAndNil(mailListText);
FreeAndNil(attachmentsText);
FreeAndNil(bodyText);
end;
end;
Ich habe im Debugger getestet ob das TryFinally sauber durchläuft und das tut es, auch wenn das Abort nicht auskommentiert ist. Also nach dem Abort läuft er ins finally.
Daher verstehe ich nicht warum ich durch dieses Abort ein MemoryLeak erhalte.
Mfg Int3g3r