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

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

Проблема с классами...


dRake ©   (2005-07-14 16:50:00) 

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

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


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

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


dRake   (2005-07-15 17:32:00) [2]

> Mx

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


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


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

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


dRake   (2005-07-15 17:03:00) [4]

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


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


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

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


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

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


PROCEDURE TObjectManager.DeleteSprite;
BEGIN;

 FFirstSprite := TSpriteObject.Create;

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

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

 FFirstSprite.Destroy; // AV !

END;


A22   (2005-07-15 12:36:00) [7]

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


dRake   (2005-07-15 12:16:00) [8]

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

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

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 00:55:00) [9]

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


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

2 A22...

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


A22   (2005-07-14 18:43:00) [11]

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

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


dRake   (2005-07-14 18:05:00) [12]

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


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

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


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

A22

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

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


dRake   (2005-07-14 17:26:00) [15]

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

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

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


A22   (2005-07-14 17:07:00) [16]

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


XProger   (2005-07-14 16:54:00) [17]

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


Наверх

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