Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

FreeAndNil никого не убивает, иногда, но постоянно


Страницы:   1 2

АлексейК ©   (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;
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.
Если я правильно понял, то при удалении объект пытается очистить память по указателю FField и не может. А может я ошибаюсь?


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?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо