![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FreeAndNil никого не убивает, иногда, но постоянно
АлексейК © (2004-07-05 13:30:00)Кусочек кода
function GetValue(...):....;
var MyForm:TMyForm;
begin
MyForm:=TMyForm.Create(...);
with MyForm do
....
ShowModal;
Result:=x;
end;
FreeAndNil(MyForm);
end.
На строке FreeAndNil(MyForm) возникает ошибка Invalid pointer operator. MyForm реально ссылается на объект (сравнивал значение при создании формы и перед уничтожением - идентичны) и объект не уничтожается. При этом ошибка возникает не при каждом вызове, но стабильно, бывает на пятом-шестом, иногда и при первом (но редко), иногда на втором, бывает и десяток вызовов нормально проходят. Форма безвариантна, при каждои вызове одни и те же действия. Ну в чем искать причину, хоть примерно.
АлексейК (2004-07-06 08:17:00) [21]В программе StrAlloc не имеет постоянного значения параметра, то есть
StrAlloc(n),где n вычисляемая величина. При этом, обнуления указателя:
Result:=FField;
FField:=nil;
FreeAndNil(MyForm)
положения не меняет, ошибка все равно остается, и она появляется не всегда, хотя данные передаеются нормально, но из десяти вызовов формы вероятность ее появления около 95%.
KADAN (2004-07-06 07:38:00) [22]по-моему форма при уничтожении должна очищать FField, если нет - то следовало бы... но и присваивать результату указатель, который потом очищается тоже не надо.
Делаешь StrAlloc с постоянным параметром 100, не проще ли завести array[0..100] of char, только отдельно от формы, и возвращать его?
АлексейК (2004-07-06 07:13:00) [23]Тему для размышлений нашел, привожу альтернативный, упрощенный код
(модуль зашит в DLL и вызывается с основной программы)
unit uMyForm;Если я правильно понял, то при удалении объект пытается очистить память по указателю FField и не может. А может я ошибаюсь?
interface
type
TMyForm=class(TForm)//вообщем просто модальная форма с гридом
...
private
...
FField:PChar;
public
...
end;
function GetValue(aHandle:THandle):pChar;//декларируется для экспорта из DLL в модуле проекта
implementation
function GetValue;
var MyForm:TMyForm;
begin
Application.Handle:=aHandle;
MyForm:=TMyForm.Create(Application);
with MyForm do
begin
...
ShowModal;
Result:=FField;
end;
FreeAndNil(MyForm);
end;//GetValue
//процедура берет значение и закрывает форму.
procedure TMyForm.btn_okClick(Sender: TObject);
begin
FField: = StrAlloc (100);
StrCopy (FField, 'Пример');
close;
end;
end.
TUser (2004-07-05 14:48:00) [24]Наверное, надо рассказать про то, что такое MyForm. Там чего-нибудь создается/память выделяется и т.д.? Что при ее создании/уничтожении происходит?
АлексейК (2004-07-05 13:56:00) [25]GuAV © (05.07.04 13:54) [8]
end. //function GetValue
а точка тогда что здесь делает?
Да запятая там конечно, просто голова уже тяжелая.
GuAV (2004-07-05 13:54:00) [26]end .//function GetValue
а точка тогда что здесь делает?
АлексейК (2004-07-05 13:52:00) [27]Я на Delphi и не грешу, только ошибка не постоянная, потому и выловить не могу.
Судя по тексту
end;
FreeAndNil(MyForm);
end.
процедура FreeAndNil выызывается в секции инициализации модуля. Или я не понял? Приведите кода побольше.
...
FreeAndNil(MyForm);
end. //function GetValue
GuAV (2004-07-05 13:52:00) [28]а если
MyForm.Release
MyForm:=nil
заместо freeandnil ?
> Уже по строчке "with MyForm do" видно, что вы любитель этой
> ошибкообильной конструкции.
Конструкция не ошибкообильна, если уметь аккуратно применить. я бы тут тоже юзал with MyForm do try (а кстати release - в finally)
icWasya (2004-07-05 13:49:00) [29]Судя по тексту
end;
FreeAndNil(MyForm);
end.
процедура FreeAndNil выызывается в секции инициализации модуля. Или я не понял? Приведите кода побольше.
Dok_3D (2004-07-05 13:47:00) [30]Ошибка у вас программе, милейший, не сомневайтесь.
Уже по строчке "with MyForm do" видно, что вы любитель этой ошибкообильной конструкции.
Отлдаживаться нужно, отлаживаться.
АлексейК (2004-07-05 13:46:00) [31]Формочка вызывается из DLL.
OnClouse не прописан вообще.
TUser (2004-07-05 13:39:00) [32]А в OnClose у этой формы не написано caFree случайно?
VMcL (2004-07-05 13:34:00) [33]>> АлексейК (05.07.04 13:30)
Что на строке
FreeAndNil(MyForm);
говорит клавиша F7 в режиме отладки в IDE?