Приветствую. Есть такой код:
class Foo()
{
virtual void Print() = 0;
};
struct FooWrap : Foo, bp::wrapper<Foo>
{
void Print()
{
this->get_override("Print")();
}
void ProcessFoo(Foo *obj) { obj->Print(); }
// Экспорт
bp::class_<FooWrap, boost::noncopyable>("Foo")
.def("Print", bp::pure_virtual(&Foo::Print))
bp::def("ProcessFoo", &ProcessFoo);
У меня есть базовый класс, я экспортирую его в python через библиотеку boost.python. Также есть фукнция, которая принимает указатель на этот класс.
Когда я пытаюсь сделать такое в питоне:
class NewFoo(Foo):
def Print():
print 'Print call'
ProcessFoo( NewFoo() )
Сегфолт — дебаггер показывает, что падает на вызове функции Print.
Логично предположить, что на стороне с++ уже невалидный указатель, скорее всего. Может нужно как-то указать через policy что-то? Или банально нельзя передать объект класса как чистый указатель в с++?