Текущий архив: 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