Форум сайта python.su
pasaranaxне найден метод преобразования… - это потому, что boost.python теряется в случае непонятного указателя с неявной политикой владения.
А в чем ошибка в моем варианте оборачивания тех двух методов? Я проверил вот по такому коду в питоне, висячей ссылки не получается:а если убрать call policy, то вылезает ошибка компиляции, и при задании property тоже ошибка компиляции “не найден метод преобразования…”import World
npc = World.NPC()
npc.Id = 10
item = World.Item()
item.setOwner(npc)
del npc
print item.getOwner().Id
class MegaBrain {
NPC* npc;
NPC* make_npc(){
npc = new NPC();
return npc;
}
void kill_npc(){
delete npc;
}
}
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. Если повезло - сразу. Обычно - гораздо позже, когда понять причину уже невозможно.
Офлайн
Спасибо, сенсей, теперь я готов отправиться в свой собственный путь =D
Офлайн
Кушай на здоровье, ученик :)
Будут вопросы - обращайся.
P.S. boost.python - очень правильный выбор.
Противоположность - C API. В котором шаг влево или вправо - потеря памяти в лучшем случае (остальное хоть как-то проявляется). Без тщательной сверки с документацией и постоянным медитированием над кодом писать вообще невозможно. Только за последние две недели видел эти ошибки несколько раз - да и сам за последний год дважды сильно лажал. При том что вроде бы знаю что к чему - а все же…
С boost.python все намного проще. Нужно лишь четко представлять для каждого места в программе:
- кто владеет
- кто создает
- кто удаляет
Офлайн