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

Вниз

Проблема с классами...   Найти похожие ветки 

 
dRake ©   (2005-07-14 16:50) [0]

Возникла такая проблема:

Имеется модуль с описанием некоторого класса.
Имеется другой модуль, в котором описан класс, который осуществляет менеджмент экземпляров класса из первого модуля.
Фигня в том, что вызов метода менеджера на уничтожение экзмепляра класса влечет за собой AV по адрессу 0. Все создается/хранится правильно, проверял. Интересно что проблема решается переносом декларации класса из другого модуля в тот же, где описан сам менеджер. Кто нибудь знает причину этого?


 
XProger ©   (2005-07-14 16:54) [1]

Телепаты в отпуске...


 
A22 ©   (2005-07-14 17:07) [2]

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


 
dRake ©   (2005-07-14 17:26) [3]

Да я сам тащусь ;)
Тут нужны именно телепаты... теперь все заработало, охренеть.

Вот минимальный код:

Object_Sprite.pas



TSpriteObject = class

 PUBLIC
 
 { Skipped  }

 FNextNode : TSpriteObject;
 FLastNode : TSpriteObject;

END;



Manager_Object.pas



USES Object_Sprite;

{...}

TObjectManager = class

 PUBLIC
 
 FirstSprite : TSpriteObject;

 PROCEDURE AddSprite(...);
 PROCEDURE DeleteSprite(...);

END;

// AddSprite

PROCEDURE TObjectManager.AddSprite(...);
BEGIN;

 {....}

 FFirstSprite := TSpriteObject.Create;

END;

// Deletesprite

procedure TObjectManager.DeleteSprite;
begin;

 FFirstSprite.Destroy;

end;



Main.pas



USES Manager_Object;

{...}

Manager := TObjectManager.Create;

Manager.AddSprite;
Manager.DeleteSprite; // Вот тут выскакивает AV



 
dRake ©   (2005-07-14 17:29) [4]

A22

>AV по адресу 0 это не проблема освобождения ресурсов, это >обращение по уже удаленному и обнуленному указателю.

Указатель нормальный, все другие методы через него работают вполне, пока дело не доходит до Destroy.


 
Плохиш ©   (2005-07-14 17:39) [5]

Сколько раз твердит Борланд не вызывайте явно Destroy используйте Free, но чайники хелпов не читают, не барское это дело.


 
dRake ©   (2005-07-14 18:05) [6]

Убей себя с разбегу чайник.
Хелпы я читаю и Destroy вызываю осознано, потому что у меня в коде _НЕ_ может возникнуть ситуация когда указатель не определен или кривой. B вообще проблема не в этом, ты хоть удосужься прочитать вопрос блин.


 
A22 ©   (2005-07-14 18:43) [7]

блин, ну чудес-то не бывает! если весь код Manager.DeleteSprite заключается в 1 строку... значит, либо все-таки неревен указатель, либо ошибка внутри деструктора спрайта

либо надо было просто сделать Rebuild All - бывает и такое :)


 
dRake ©   (2005-07-15 00:05) [8]

2 A22...

Указатель верен 100%, перед вызовом Destroy вызываю еще несколько методов и смотрю дебагером. Manager.DeleteSprite в одну строчку (остальное закоментировал как несущественное ;)
Блин ничего не помогает :( Rebuld тоже не помогает, зато помогает установка брейкпоинта на Manager.DeleteSprite =)
Не понимаю сути этого бага - толи это Делфя глючит, толи я косячу


 
A22 ©   (2005-07-15 00:55) [9]

так, а ошибка выскакивает всегда? т.е. в 100% случаев вызова DeleteSprite? если нет - дело может быть в многопоточности


 
dRake ©   (2005-07-15 12:16) [10]

Да всегда. Многопоточности нет.

Причем если сделать так

Manager_Object.pas

PROCEDURE TObjectManager.DeleteSprite( Sprite : TSpriteObject );
BEGIN;

 Sprite.Destroy;

END;


И вызывать так:

Main.pas

Manager.DeleteSprite(TSpriteObject.Create);


То все работает!
Если же вызвать так:

Main.pas

{ FFirstSprite проинициализирован }

Manager.DeleteSprite(Manager.FFirstSprite);


То выскакивает AV. Причем если установить брейкпоинт на строчку
Sprite.Destroy, то AV не выскакивает. Самое интересное, что после AV окно CPU показывает что код выполняется по нулевому адресу!


 
A22 ©   (2005-07-15 12:36) [11]

значит все-таки Manager.FFirstSprite == NULL. а отсутствие ошибки при брейкпоинте может быть из-за того exeption AV не обрабатывается в дебаге. баг или так и задумывалось, хз.


 
dRake ©   (2005-07-15 12:45) [12]

Смотри дальше =)


PROCEDURE TObjectManager.DeleteSprite;
BEGIN;

 FFirstSprite := TSpriteObject.Create;

 FFirstSprite.Tag := "Fuck"; // Нормально работает

 ShowMessage(FFirstSprite.Tag); // Все нормально показывает...

 FFirstSprite.Destroy; // AV !

END;


 
Плохиш ©   (2005-07-15 12:53) [13]


> dRake ©   (15.07.05 12:45) [12]

Исправляй ошибку в 17й строке деструктора TSpriteObject.Destroy.


 
dRake ©   (2005-07-15 17:03) [14]

К сожалению у меня деструктор не переопределен ;)


 
Mx ©   (2005-07-15 17:27) [15]


> dRake ©   (15.07.05 17:03) [14]

А как используются поля класса TSprteObject? Может он с кем-то связан? И после вызова деструктора эта связь становится некорректной?


 
dRake ©   (2005-07-15 17:32) [16]

> Mx

В TSpriteObject"e только несколько полей типа Single, тем более что никакой работы с экземплярами класса в коде пока нет. Ошибка вылазит в минимальном варианте - создание объекта и сразу же удаление объекта.


 
dRake ©   (2005-07-15 17:38) [17]

О чудо! Все заработало!
Наверное вчера была магнитная буря.. :)



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

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

Наверх




Память: 0.51 MB
Время: 0.055 c
6-1114837814
snigir
2005-04-30 09:10
2005.08.07
Как програмным путём обеспечить модемный пул?


1-1120553849
KyRo
2005-07-05 12:57
2005.08.07
Поиск на диске


14-1121353595
Сибиряк
2005-07-14 19:06
2005.08.07
Портировать с РНР на Delphi.


4-1117717537
AlexTregubov
2005-06-02 17:05
2005.08.07
Плоский ComboBox


1-1121848608
Oleg_
2005-07-20 12:36
2005.08.07
Кнопка в stringgrid