
Последние записи
- Проверка на шестнадцатеричный формат записи
- Отдать пользователю файл с помощью file_get_contents()
- Написать собственую функцию operator[] для битов
- Проблема с движением 2D человека
- OpenGl.Создание винтовой лестницы
- Склеить несколько файлов в один
- Windows 10 сменить администратора
- Рандомное слайдшоу
- Событие для произвольной области внутри TImage
- Удаление папки с файлами

Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk

Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
13th
Сен
Не закрывается TFileStream (Delphi)
Posted by obzor under Delphi
Проблема в том, что при открытии второго файла InFileR возникает исключение (не могу получить доступ к файлу, так как он занят другим процессом), которое я вижу в except, и после этого не выполняется FreeAndNil(InFileR);, т.е. на нем тоже возникает исключение.
Что я делаю не так? Во всех примерах в интернете с TFileStream в try выполняется create, а в finally выполняется Free. Собственно Free я тоже пробовал, результат тот же.
var
InFileL,InFileR: TFileStream;
begin
try
try
InFileL:=TFileStream.Create(NameL,fmShareDenyNone);
InFileR:=TFileStream.Create(NameR,fmShareDenyNone);
//действия с файлами (в частности сравнение контрольных сумм)
except
on E: Exception do ShowMessage(E.Message);
end;
finally
FreeAndNil(InFileL);
FreeAndNil(InFileR);
end;
или так
var
InFileL,InFileR: TFileStream;
begin
try
InFileL:=TFileStream.Create(NameL,fmShareDenyNone);
try
InFileR:=TFileStream.Create(NameR,fmShareDenyNone);
try
//действия с файлами (в частности сравнение контрольных сумм)
finally
InFileR.Free;
end;
finally
InFileL.Free;
end;
except
on E: Exception do ShowMessage(E.Message);
end;
или так
var
InFileL,InFileR: TFileStream;
begin
InFileL:=nil;InFileR:=nil;
try
try
InFileL:=TFileStream.Create(NameL,fmShareDenyNone);
InFileR:=TFileStream.Create(NameR,fmShareDenyNone);
//действия с файлами (в частности сравнение контрольных сумм)
except
on E: Exception do ShowMessage(E.Message);
end;
finally
FreeAndNil(InFileL);
FreeAndNil(InFileR);
end;
а лучше последовательное создание и убийство
a:=Create
try
crc(a);
finally
a.free;
end;
b:=Create
try
crc(b)
finally
b.free;
end;
if a<>b .....
Всё бы хорошо, но конструкция
try
SomeObject:=TSomeObject.Create();
... //что-то делаем
finally
SomeObject.Free; //FreeAndNil(SomeObject);
бессмысленна и способна только добавить новое исключение.
Ибо если исключение возникает в конструкторе объекта, то объект просто не создаётся. И его не нужно уничтожать.
Т.е. конструкция для временного создания любого объекта с последующим его уничтожением должна выглядеть так:
SomeObject:=TSomeObject.Create();
try
... //деоаем что-то
finally
SomeObject.Free. //FreeAndNil(SomeObject);
end;
вы забыли SomeObject:=nil;
т.к. переменная в стеке — там мусор и может произойти «Garbage.Free» — AV
но при начальной инициализации нилом все безопасно «nil.Free» — ОК
пруф:
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
проверка:
procedure TForm1.Button1Click(Sender: TObject);
var SomeObject:TButton;
begin
try
Abort;
SomeObject:=TButton.Create(nil);
finally
SomeObject.Free;//AV
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var SomeObject:TButton;
begin
SomeObject:=nil;
try
Abort;
SomeObject:=TButton.Create(nil);
finally
SomeObject.Free;//нет AV
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var SomeObject:TButton;
begin
SomeObject:=nil;
SomeObject.Free;//нет AV
TObject(nil).Free;// и тут нет AV
end;
PS Я не пропагандирую за такой стиль, но оставляю его возможным
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту

пеллетные котлы

Пеллетный котел Emtas

Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)