Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.20;
Скачать: CL | DM;

Вниз

Обхект и метод Free   Найти похожие ветки 

 
PigMey ©   (2003-10-07 20:35) [0]

Может ли при вызове метода Free к какому-нибудь объекту возникать ошибка?


 
Palladin ©   (2003-10-07 20:38) [1]

Запросто.


 
HolACost! ©   (2003-10-07 20:38) [2]

ага! А что за ошибка-то?!


 
Anatoly Podgoretsky ©   (2003-10-07 20:51) [3]

PigMey © (07.10.03 20:35)
Нет


 
PigMey ©   (2003-10-07 20:52) [4]

Вообщем я начал создавать свой класс и решил проверить его работу. Если я пишу код:
MyClass.Create;
MyClass.Free;
То все ОК,
Но стоит только вписать какой-нибудь метод между ними, то вылетает ошибка Access Violation по такому-то адресу, почему?


 
Anatoly Podgoretsky ©   (2003-10-07 20:57) [5]

Покажи объявление MyClass и где он создается, должет существовать до этих двух строк


 
DiamondShark ©   (2003-10-07 21:10) [6]


> почему?

Потому...

В строках

> MyClass.Create;
> MyClass.Free;

MyClass -- имя класса, или экземпляра? Ась?
Судя по тому, что компилятор пропускает, всё-таки экземпляра...

Думать дальше будем сами?
Или ликбез продолжим?


 
Fay   (2003-10-07 21:13) [7]

Ку?
MyClass1 := MyClass.Create;
MyClass1.BlaBlaBla(BuBuBu);
MyClass1.Free;


 
Anatoly Podgoretsky ©   (2003-10-07 21:15) [8]

Fay (07.10.03 21:13) [7]
Ну и что, все равно MyClass должен быть создат до этой строчки.


 
PigMey ©   (2003-10-07 21:16) [9]

MyClass - имя экземпляра, а не класса


 
Palladin ©   (2003-10-07 21:18) [10]


> Anatoly Podgoretsky © (07.10.03 20:51) [3]

Здря Вы так, Анатолий :) Ошибок в деструкторе никто не отменял еще... и повторное удаление уже удаленного объекта (но не выставленного в Nil) тоже может вызвать AV


> PigMey © (07.10.03 20:52) [4]

Парень, MyClass.Create, так не пишут... MyClass:=TMyClass.Create; вот так пишут..


 
Anatoly Podgoretsky ©   (2003-10-07 21:25) [11]

Palladin © (07.10.03 21:18) [10]
Не зря, во первых это не деструктор, а простая процедура, которая просто проверяет адрес объекта на Nil и если он не Nil то вызывает деструктор. Так что ошибке в ней быть не может, могут быть ошибки в деструкторе или недействительная переменная, но только не в Free

MyClass.Create точно также можно писать, это нормальный вызов конструктора, но только объект должен существовать.


 
PigMey ©   (2003-10-07 21:29) [12]

Точно, вопросов больше нет - спасибо.


 
Raduga   (2003-10-08 12:49) [13]

>Anatoly Podgoretsky
Почему не вылетает ошибка?


...
TMyClass=class
i:integer;
constructor Create();virtual;
destructor Destroy;override;
end;
...

var m:TMyClass;
...
begin
...

procedure Proc1;
begin
m:=TMyClass.Create;
m.i:=10;
m.Free;
m.i:=20;//-----------------вот сдесь---------------
end;
....
end;


 
Raduga   (2003-10-08 12:50) [14]

>Anatoly Podgoretsky
Почему не вылетает ошибка?


...
TMyClass=class
i:integer;
constructor Create();virtual;
destructor Destroy;override;
end;
...

var m:TMyClass;
...
begin
...

procedure Proc1;
begin
m:=TMyClass.Create;
m.i:=10;
m.Free;
m.i:=20;//-----------------вот сдесь---------------
end;
....
end;


 
Юрий Федоров ©   (2003-10-08 12:51) [15]

>>Raduga (08.10.03 12:49) [13]
Повезло.
Точнее не повезло


 
Анонимщик ©   (2003-10-08 12:55) [16]

А не здесь разве:
m.Free - ?

Вообще вы все все позапутывали, особенно спрашивающего


 
Anatoly Podgoretsky ©   (2003-10-08 12:57) [17]

Raduga (08.10.03 12:49) [13]
Ты в рубашке родился


 
Raduga   (2003-10-08 13:01) [18]

>Юрий Федоров
А при чем сдесь везение, это тестовый вариант и он почему то работает...
>Анонимщик
>А не здесь разве:
>m.Free - ?
Сдесь ошибка не должна вылетать впринципе.
Почему срабатывает следующая строчка, вот в чем вопрос?


 
Anatoly Podgoretsky ©   (2003-10-08 13:03) [19]

Ну так счастличик


 
Raduga   (2003-10-08 13:03) [20]

Протестите САМИ


 
Raduga   (2003-10-08 13:06) [21]

Сообщение об ощибке, только если явно выставляю в нил после m.free, т.е.

m.free
m:=nil;
m.i:=20;


 
Verg ©   (2003-10-08 13:07) [22]


> Raduga (08.10.03 13:01) [18]
> Почему срабатывает следующая строчка, вот в чем вопрос?


Она не срабатывает. Она просто не вызывает ошибку.

Когда на дороге пусто, можно же и зигзагами поездить, правильно?


 
Palladin ©   (2003-10-08 13:07) [23]

счастливчик потому что кусок памяти по адресу m.i еще никем не используется, а может используется, вот только поймешь это ты ощутишь немного попозже... и будешь в недоумении, а чего это у тебя не работает ничего, откуда AV...


 
Palladin ©   (2003-10-08 13:08) [24]


> Когда на дороге пусто, можно же и зигзагами поездить, правильно?

:))


 
Raduga   (2003-10-08 13:10) [25]

>Palladin
Спасибо


 
Анонимщик ©   (2003-10-08 13:25) [26]

Raduga
Пардон, самопроизвольно попереставлял строки и вызовы.



Страницы: 1 вся ветка

Текущий архив: 2003.10.20;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.015 c
6-65564
SergP
2003-08-24 15:22
2003.10.20
TServerSocket. Что это за странные хенделы -1 ?


14-65593
andre
2003-10-02 01:18
2003.10.20
Что посоветуете?


3-65312
andrey__
2003-09-30 13:22
2003.10.20
Метод Locate (компонент TADOQuery)


4-65665
=SOFT=
2003-08-14 17:57
2003.10.20
Как создать процес и узнать что он завершился?


1-65470
Zmei
2003-10-09 09:40
2003.10.20
как из числа выделить целую часть 3.83 -> 3