Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Странная ошибка при вызове деструктора


Автор: Cheburek 6.8.2006, 09:33
Откуда вообще такая могла произоити??? Не понимаю!!  smile 
Деструктор
Код

destructor OptOs.Destroy;
begin
    SetLength(KoafPr,0,0);
    SetLength(YgNorm,0,0);
  inherited;
end;

вызов
Код

s.Destroy;
s := nil;


ну все стандартно .... хоть какие-нибуть варианты почему может произоити такая ошибка в данном случае есть?

Автор: Angel_19 6.8.2006, 10:36
Попробуй вызвать

Код

s.free;
s:=nil;

Автор: Cheburek 6.8.2006, 10:52
Angel_19, 
Аналогичная ошибка.

Кстати, если в теле деструктора вообще ничего не написать, 
Код

destructor OptOs.Destroy;    
begin    
   {все равно при вызове происходит эта ошибка}
end;


всеравно аналогичная ошибка...

вот я думаю - это код у меня что-ли до такой степени глючный, или делфи =)?

ps Кто захочет посмотреть программу могу выложить на ftp 

Автор: Sunr1se 6.8.2006, 10:56
Я у себя попробовал сделать класс с полями KoafPr и YgNorm и с таким же деструктором, как у тебя. Все работает без ошибок.
Выложи, пожалуйста, полностью код, попробую что-нибудь понять ;)

Автор: Cheburek 6.8.2006, 11:50
Код

{внизу можно скачать все исходники}


весь каласс =) со всяким временным мусором в юните ))) щас времени нет - а вот через пару часиков смогу залить весь код на ftp потому как по одному этому юниту нифега не понять ...

Автор: Alexeis 6.8.2006, 12:46
Cheburek, нужно знать какая строчка вызывает ошибку, создается впечатление, что этот класс здесь ни при чем.

Автор: Cheburek 6.8.2006, 13:19
Вот вообщем-то вся программа. Помогите люди добрые!! Ошибка  в обработке в главном меню пункт "Закрыть документ". Временно там поставлен перехвадчик ошибок...
http://megafizz.com/cheburek/ray.rar

alexeis1
но компилятор не сообщает строчки = ) ..... может опять что-то проглядел = ( ... вообще сложно не согласиться ...

Автор: Alexeis 6.8.2006, 15:27
Цитата(Cheburek @  6.8.2006,  13:19 Найти цитируемый пост)
но компилятор не сообщает строчки

Для этого существует трасировка!

Автор: jack128 6.8.2006, 16:05
обычна эта ошибка говорит о том, что ты пытаешься уничтожить уже несуществующий или вообще не созданный объект. Везде, где уничтожаешь объекты - используй FreeAndNil(), тогда ситуация возможно прояснится.

Автор: Cheburek 6.8.2006, 19:38
jack128, Invalid pointer operation  ???? 

alexeis1, 
Трасировка показывает на вызов деструктора, исхродники все же выложил, если не сложно посмотрите.

Еще раз если до этого было не заметно =)
http://megafizz.com/cheburek/ray.rar

Автор: jack128 6.8.2006, 20:07
Цитата(Cheburek @  6.8.2006,  19:38 Найти цитируемый пост)
jack128, Invalid pointer operation  ???? 

иммено. ПРичем совсем не обязательно речь об объекте в котором возникает это исключение. Хотя и достаточно вероятно.

Автор: Cheburek 6.8.2006, 20:15
jack128, Ну это вообще нереально ... Объект создаеться один раз и удаляеться один раз. Внутри объекта другие объекты вообще не используються ...

Автор: jack128 6.8.2006, 23:11
Цитата(Cheburek @  6.8.2006,  20:15 ) 
Внутри объекта другие объекты вообще не используються ...  


Да, в твоем случае причина была в другом.

Ты почему ко компилируешь свою программу без range check'ов что и приводит к трудно уловимым ошибкам.

в методе procedure OptOs.OFRLinze(h,R,xs,Nsr:real;pic:TImage;k,THColor:integer);

вот в этой строчке    
Код

    FOR y := round(WinY/2-(h/2)) TO  round(WinY+(h/2)) DO begin
        YgNorm[round(xs),y] := 0;

 
 


у тя происходит выход за диапозон массова..  В результате бьется память, и при попытке файлализировать дин массив - ты и получаешь свой Invalid pointer operation.
Если бы у тя изначально строяла проверка диапозонов - ты сам быстро обнаружил ошибку.

Вывод:  в меню Project/Options - закладка Compiler/Runtime Errors - первая и третья галки всегда должны быть включены. Кроме особо оговоренных случаев. 

Автор: Cheburek 8.8.2006, 09:58
Спасибо. Репутацию изминить не могу =(, может когда наберу достаточное количество сообщений, то поставлю плюс.

А что там за ошибки с битмапами.

в методе procedure OptOs.OFRLinze(h,R,xs,Nsr:real;pic:TImage;k,THColor:integer);
Код

         p := b.scanline[tempy];
         p[round(tempx-xs)].r := byte(THColor);

Автор: jack128 9.8.2006, 23:49
Цитата(Cheburek @  8.8.2006,  09:58 Найти цитируемый пост)
А что там за ошибки с битмапами.

гы. успел прочитать таки? smile

Код

type
  ARGB = array[0..1] of TRGB;
  PARGB = ^ARGB;

вот так нельзя объявлять указатели на массивы.  Лудше писать так:

Код

type
  ARGB = array[0..MaxInt div SizeOf(TRGB) - 1] of TRGB;
  PARGB = ^ARGB;

именно по причине исключений, которые будут кидаться при компиляции с $R+  Например посмотри как подобные массивы объявлены у борланда, PPointerList и тд..

Автор: Cheburek 10.8.2006, 09:54
jack128, Честно говоря ничего не понял. Не знаешь где на эту тему можно что-нибуть почитать ... а то даже по каким словам искать материал на эту тему не знаю...


Цитата(jack128 @  9.8.2006,  23:49 Найти цитируемый пост)
код Pascal/Delphi    
Код
    
type    
  ARGB = array[0..1] of TRGB;    
  PARGB = ^ARGB;
    

вот так нельзя объявлять указатели на массивы.  Лудше писать так:


этот код кстати был взят из фака этого сайта )

Автор: bems 13.8.2006, 18:06
Цитата(Cheburek @  10.8.2006,  09:54 Найти цитируемый пост)
этот код кстати был взят из фака этого сайта )
а там вероятно переведен с Си smile 

Автор: VMChaZ 15.8.2006, 01:40
2 Cheburek
воспользуйся списками вместо массивов. если свой тип списка делать лень, - то TStringlist с AddObject.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)