Форум: "Начинающим";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];
Внизraise in Constructor Найти похожие ветки
← →
VEZ (2006-05-19 14:28) [0]Здравствуйте! Корректно ли в конструкторе генерить исключение для того чтоб отменить создания объекта. Проблема в том что в конструктор класса передаётся имя файла, и конструктор проверяет правильность его формата, если формат неверен, то объект создавать ненужно. Особенно это актуально у фреймов или форм, когда надо заполнить элементы управления на них, при этом чтоб не срабатывало событие OnChange. И какие есть способы отмены создания объекта самим собой на этапе его создания.
← →
Сергей М. © (2006-05-19 14:32) [1]По дифолту - корректно .. А в чем сомнения ? Ты сомневаешься в том , будет ли вызван в такой ситуации диструктор ?
← →
VEZ (2006-05-19 14:47) [2]Ну у меня случилась такая ситуация, что после сообщения с исключением происходит Acess Violation, причём в дебагере посмотрел вроде всё нормально, после raise дебагер перескакивает в конец конструктора, и после следующего нажатия F8 выскакивает AV.
← →
VEZ (2006-05-19 14:50) [3]И ещё меня интересует освобождается ли память выделенная под объект при таком подходе.
← →
Плохиш © (2006-05-19 14:55) [4]
> VEZ (19.05.06 14:47) [2]
> Ну у меня случилась такая ситуация
Не могли бы Вы показать эту ситуацию на примере кода?
> VEZ (19.05.06 14:50) [3]
> И ещё меня интересует освобождается ли память выделенная
> под объект при таком подходе.
Да
← →
Сергей М. © (2006-05-19 14:56) [5]
> освобождается ли память выделенная под объект при таком
> подход
Да, освобождается.
Но - под объект, а не под все то что он успел "поназанимать" в ходе исполнения своего конструктора.
Т.е.
constructor TSomeClass.Create(..);
begin
.,.
GetMem(SomePtr, 16);
..
.. здесь возникла искл.ситуация
end;
destructor TSomeClass.Destroy;
begin
...
FreeMem(SomePtr); без этоц строчки мемлик будет гарантирована
...
end;
← →
VEZ (2006-05-19 15:10) [6]constructor TMyObj.Create(Parent:TObj; VisParent: TComponent;
Node: TTreeNode; ini: TMemIniFile);
var
s:string;
IONode:TTreeNode;
DeleteFile:boolean;
Ext:string;
{tmpini}OriginalFileName:TFileName;
begin
Ext:=ExtractFileExt(ini.FileName);
//DeleteFile:=fa
OriginalFileName:=ini.FileName;
if AnsiCompareText(Ext,".Hex")=0 then
begin
ini.Rename(ConvertHexTotmpIni(ini.FileName),true);
//ini.Rename("",false);
SysUtils.DeleteFile(ini.FileName)
{if tmpini<>"" then
begin
ini.Free;
ini:=TIniFile.Create(tmpini);
end;}
end;
FVisParent:=VisParent;
FParent:=Parent;
FChanged:=false;
FChangedDate:=FileDateToDateTime(FileAge({ini.FileName}OriginalFileName));
if FChangedDate=-1 then
FChangedDate:=Now;
FCanDrag:=true;
FMyObjType:=GetMyObjTypeTypeFromIni(ini);
if FENKSType=Unknown then
{Exit}raise Exception.Create("Неизвестный тип Объекта"); // Тут генерицца исключение
... // Some code - не выполняется при исключении
end; // Тут возникает AV.
← →
VEZ (2006-05-19 15:37) [7]Действительно, мой деструктор вызывается автоматически, и там происходит попытка освободить несозданный в конструкторе объект, проблема закрыта, всем спасибо.
← →
Сергей М. © (2006-05-19 15:38) [8]Ты это к чему ?
К тому что Делфи-отладчик для тебя - пятно на Луне ?
← →
Сергей М. © (2006-05-19 15:40) [9]
> мой деструктор вызывается автоматически
Иначе и быть неможет.
Повсему - "все в твоих руках" (С) Известная приятная барышня
← →
Сергей М. © (2006-05-19 15:40) [10]Удалено модератором
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.044 c