![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с классами...
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]Телепаты в отпуске...