Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 4, 2009 05:05:40

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

boost.python и shared libraries

pasaranax
А в чем ошибка в моем варианте оборачивания тех двух методов? Я проверил вот по такому коду в питоне, висячей ссылки не получается:
import World

npc = World.NPC()
npc.Id = 10
item = World.Item()
item.setOwner(npc)
del npc
print item.getOwner().Id
а если убрать call policy, то вылезает ошибка компиляции, и при задании property тоже ошибка компиляции “не найден метод преобразования…”
не найден метод преобразования… - это потому, что boost.python теряется в случае непонятного указателя с неявной политикой владения.
Я ваш код не компилил, не могу сказать больше. Если интересно - посмотрю более подробно.

Ваш “тестовый пример” не вполне корректен - потому и живет.
Кстати, речь идет не о “кольце”, оно же “висячая ссылка” - а о повреждении памяти.
class MegaBrain {
NPC* npc;
NPC* make_npc(){
npc = new NPC();
return npc;
}
void kill_npc(){
delete npc;
}
}
Оборачиваем MegaBrain.
import World
npc = World.MegaBrain.make_npc()
npc.Id = 10
item = World.Item()
item.setOwner(npc)
World.MegaBrain.kill_npc()
print item.getOwner().Id # попались. Объекта npc уже нет, а питон на него все еще ссылается.
#Результат - core dump. Если повезло - сразу. Обычно - гораздо позже, когда понять причину уже невозможно.
Может, это не ваш случай и все объекты вы делаете только со стороны питона.
Тогда приходим к моему облегченному варианту номер 2.
Есть четкие договоренности между программистами и никто кроме питона не “владеет” объектами, выставленными питону на управление.



Офлайн

#2 Дек. 4, 2009 20:49:28

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

boost.python и shared libraries

Спасибо, сенсей, теперь я готов отправиться в свой собственный путь =D



Офлайн

#3 Дек. 5, 2009 05:22:18

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

boost.python и shared libraries

Кушай на здоровье, ученик :)
Будут вопросы - обращайся.

P.S. boost.python - очень правильный выбор.
Противоположность - C API. В котором шаг влево или вправо - потеря памяти в лучшем случае (остальное хоть как-то проявляется). Без тщательной сверки с документацией и постоянным медитированием над кодом писать вообще невозможно. Только за последние две недели видел эти ошибки несколько раз - да и сам за последний год дважды сильно лажал. При том что вроде бы знаю что к чему - а все же…

С boost.python все намного проще. Нужно лишь четко представлять для каждого места в программе:
- кто владеет
- кто создает
- кто удаляет



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version