Env: Delphi 2007
‹Обоснование> Я часто использую сложные записи, так как они предлагают почти все преимущества классов, но с гораздо более простой обработкой. ‹/Justification>
Как бы то ни было, одна особенно сложная запись, которую я только что реализовал, - это мусор памяти (позже приводящий к ошибке «Недопустимая операция указателя»).
Это пример кода очистки памяти:
sSignature := gProfiles.Profile[_stPrimary].Signature.Formatted(True);
Во второй раз, когда я называю это, я получаю "Недопустимая операция указателя"
Он работает нормально, если я назову это так:
AProfile := gProfiles.Profile[_stPrimary];
ASignature := AProfile.Signature;
sSignature := ASignature.Formatted(True);
Фоновый код:
gProfiles: TProfiles;
TProfiles = Record
private
FPrimaryProfileID: Integer;
FCachedProfile: TProfile;
...
public
< much code removed >
property Profile[ProfileType: TProfileType]: TProfile Read GetProfile;
end;
function TProfiles.GetProfile(ProfileType: TProfileType): TProfile;
begin
case ProfileType of
_stPrimary : Result := ProfileByID(FPrimaryProfileID);
...
end;
end;
function TProfiles.ProfileByID(iID: Integer): TProfile;
begin
<snip>
if LoadProfileOfID(iID, FCachedProfile) then
begin
Result := FCachedProfile;
end
else
...
end;
TProfile = Record
private
...
public
...
Signature: TSignature;
...
end;
TSignature = Record
private
public
PlainTextFormat : string;
HTMLFormat : string;
// The text to insert into a message when using this profile
function Formatted(bHTML: boolean): string;
end;
function TSignature.Formatted(bHTML: boolean): string;
begin
if bHTML then
result := HTMLFormat
else
result := PlainTextFormat;
< SNIP MUCH CODE >
end;
Итак, у меня есть запись внутри записи внутри записи, которая приближается к путанице на начальном уровне, и я первым признаю, что это не совсем хорошая модель. Ясно, что мне придется его реструктурировать. Я хотел бы, чтобы вы, гуру, лучше понимали, почему он уничтожает память (что-то связанное со строковым объектом, который создается, а затем освобождается ...), чтобы я мог избежать подобных ошибок в будущем.
Спасибо