使用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
我的环境:
add_property
顺序如何,Ubuntu 14.04(64位)都没有问题。
为什么会发生这种情况?