在Boost.Python中add_property的奇怪行为

时间:2016-09-13 07:46:31

标签: c++ boost cygwin boost-python

使用Boost.Python的add_property时遇到了一个奇怪的行为。

以下是示例代码,它只是向包装类添加两个属性(只读和读写)。

#include <boost/python.hpp>

using namespace boost::python;

struct X {
    X( int value ) : val( value ) {}

    int get_value() const
    { return val; }

    void set_value(int value)
    { val = value; }

    int val;
};

BOOST_PYTHON_MODULE(hello) {
    class_<X>("X", init<int>() )
        // NOTE the order
        .add_property( "val_r", &X::get_value )  // read-only first
        .add_property( "val_rw", &X::get_value, &X::set_value ) // read-write second
    ;
}

和构建命令:

$ g++ -I/usr/include/python2.7 -shared -L/usr/local/lib -o bp.dll bp.cpp -lboost_python -lpython2.7

我在Cygwin x86_64工作,因此文件扩展名为.dll。至于Ubuntu,只需将输出扩展名更改为.so

导入bp模块时,它会因分段错误而崩溃。核心转储文件不包含任何调用堆栈信息。

但是,如果我更改add_property的顺序(如下所示)以首先添加读写属性,则可以正常工作。

.add_property( "val_rw", &X::get_value, &X::set_value ) // read-write first
.add_property( "val_r", &X::get_value )  // read-only second

我的环境:

  • Cygwin x86_64
  • python 2.7.10
  • gcc 5.4.0
  • 提升:1.60.0
顺便说一下,无论add_property顺序如何,Ubuntu 14.04(64位)都没有问题。

为什么会发生这种情况?

0 个答案:

没有答案