工厂返回提升暴露python对象seg故障

时间:2015-09-25 14:53:27

标签: python c++ boost polymorphism python-stackless

我在通过工厂公开多态类层次结构时遇到了一个邪恶的问题。我创建了一个演示此问题的示例。

这一切都托管在带有嵌入式python(无堆栈2.7)解释器的可执行文件中。当我运行可执行文件并获取Python代码时,我可以从工厂创建一个变量(a = MakeB()),这会返回一个指向TestA类的智能指针,但它拥有一个TestB实例。我遇到的问题是,当我访问基类成员变量/函数时,它可以工作,但访问TestB变量/函数会生成段错误11(osx)。

返回的实例向python报告其类为TestB(报告相同),并且打印消息显示构建并返回了TestB。值得注意的是,我直接创建了TestB(与工厂相对),基类的变量/函数正常工作。

我的实际生产代码更复杂,但这已归结为此测试示例。如果有人认为它会有所帮助,我可以提供段错误的回溯。

感谢。

>print sys.version
2.7.6a1 Stackless 3.1b3 060516 (default, Jan 10 2014, 13:13:51) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)]

hpp文件

class TestA;
typedef boost::shared_ptr<TestA> TestAPtr;
class TestB;
typedef boost::shared_ptr<TestB> TestBPtr;
class TestA
{
public:

    TestA();
    virtual ~TestA();
    static void Boost(void);
    string Aprop;
    void FuncA();

};

class TestB : public TestA
{
public:

    TestB();
    virtual ~TestB();
    static void Boost(void);
    string Bprop;
    void FuncB();
};

cpp文件

TestA::TestA() : Aprop("Test A")
{
    printf("Create TestA\n");
}
TestA::~TestA()
{
    printf("Destroy TestA\n");
}
void TestA::Boost(void)
{
    class_< TestA >("TestA", init<>())
        .def("FuncA", &TestA::FuncA)
        .def_readwrite("Aprop", &TestA::Aprop)
        ;
    register_ptr_to_python< boost::shared_ptr<TestA> >();
}
void TestA::FuncA()
{
    printf("Hi From Test A\n");

}

// ------ Test B

TestB::TestB() : TestA(), Bprop("Test B")
{
    printf("Create TestB\n");
}

TestB::~TestB()
{
    printf("Destroy TestB\n");
}
void TestB::Boost(void)
{
    class_< TestB, bases<TestA> >("TestB", init<>())
    .def("FuncB", &TestB::FuncB)
    .def_readwrite("Bprop", &TestB::Bprop)    
    ;
    register_ptr_to_python< boost::shared_ptr<TestB> >();
}
void TestB::FuncB()
{
    printf("Hi From Test B\n");
}

// Factory...
TestAPtr MakeB()
{
    return boost::shared_ptr<TestA>(new TestB());
}

BOOST_PYTHON_MODULE(__builtin__)
{
    TestA::Boost();
    TestB::Boost();

    def("MakeB", MakeB);
}

0 个答案:

没有答案