Boost.Python+;OpenGL分割错误 我有一个(几乎)完美的C++代码,用Boost.Python编写的。它包装了一个由3个或4个类组成的基于指针的共享结构层次结构,没有什么非常复杂的东西(例如,类a有一个由类B实例指针组成的std::vector,等等),顶层包称为foo
不久前,我决定使用PyOpenGL将可视化添加到项目中。所以现在,每当我有代码>导入OpenGL<代码>之前,我有<代码>导入FoO < /C> >,我在C++代码中得到了分割错误(例如当我迭代对象序列和它们的子对象时) 我最好的假设是OpenGL以某种方式替代了内存分配函数,或者做了类似的不神圣的事情。有人能解释一下情况吗?我会尽力按要求提供更多细节,但整个事情似乎相当混乱 根据要求,独立测试用例: 生成文件:Boost.Python+;OpenGL分割错误 我有一个(几乎)完美的C++代码,用Boost.Python编写的。它包装了一个由3个或4个类组成的基于指针的共享结构层次结构,没有什么非常复杂的东西(例如,类a有一个由类B实例指针组成的std::vector,等等),顶层包称为foo,python,memory,opengl,boost,segmentation-fault,Python,Memory,Opengl,Boost,Segmentation Fault,不久前,我决定使用PyOpenGL将可视化添加到项目中。所以现在,每当我有代码>导入OpenGL之前,我有导入FoO < /C> >,我在C++代码中得到了分割错误(例如当我迭代对象序列和它们的子对象时) 我最好的假设是OpenGL以某种方式替代了内存分配函数,或者做了类似的不神圣的事情。有人能解释一下情况吗?我会尽力按要求提供更多细节,但整个事情似乎相当混乱 根据要求,独立测试用例: 生成文件: all: g++ -shared -o foo.so -fPIC \ -I
all:
g++ -shared -o foo.so -fPIC \
-I/usr/include/boost-1_37/ -I/usr/include/python2.5 \
-lpython2.5 -lboost_python-1_37 \
foo.cpp
Python文件:
from OpenGL import *
import foo
b = foo.B()
for i in range(10):
b.elements.append(foo.A())
for e in b.elements:
print e
# Crash here if `from OpenGL import *` is present.
C++文件:
#include <boost/python.hpp>
#include <boost/shared_ptr.hpp>
#include <vector>
namespace bp = boost::python;
struct A {
typedef boost::shared_ptr<A> ptr;
};
struct B {
typedef boost::shared_ptr<B> ptr;
std::vector<A::ptr> elements;
};
// Proxies B::elements without converting them
// back and forth between lists.
struct ElementProxy {
static ElementProxy
init(B::ptr b)
{
return ElementProxy(b);
}
ElementProxy(B::ptr b)
: b_(b)
{}
size_t
len()
{
return (*b_).elements.size();
}
A::ptr
getitem(size_t i)
{
if (i >= len()) {
PyErr_SetString(PyExc_IndexError, "Index out of bounds.");
bp::throw_error_already_set();
}
return (*b_).elements[i];
}
void
append(A::ptr e)
{
(*b_).elements.push_back(e);
}
static boost::python::class_<ElementProxy>
wrap()
{
return bp::class_<ElementProxy>("ElementProxy", bp::no_init)
.def("__len__", &ElementProxy::len,
(bp::arg("self")),
"Returns the number of contained elements"
)
.def("__getitem__", &ElementProxy::getitem,
(bp::arg("self"), bp::arg("i")),
"Returns the element at given index"
)
.def("append", &ElementProxy::append,
(bp::arg("self"), bp::arg("element")),
"Appends an element"
)
;
}
private:
B::ptr b_;
};
BOOST_PYTHON_MODULE(foo) {
bp::class_<A, A::ptr, boost::noncopyable>("A") ;
ElementProxy::wrap();
bp::class_<B, B::ptr, boost::noncopyable>("B")
.add_property("elements", &ElementProxy::init) ;
}
#包括
#包括
#包括
名称空间bp=boost::python;
结构A{
typedef boost::shared_ptr ptr;
};
结构B{
typedef boost::shared_ptr ptr;
std::向量元素;
};
//代理B::元素而不转换它们
//在列表之间来回移动。
结构元素代理{
静态元素代理
init(B::ptrb)
{
返回元素代理(b);
}
ElementProxy(B::ptr B)
:b_(b)
{}
尺寸
len()
{
return(*b_).elements.size();
}
A::ptr
getitem(尺寸i)
{
如果(i>=len()){
PyErr_SetString(PyExc_索引器,“索引超出范围”);
bp::throw_error_ready_set();
}
返回(*b_).元素[i];
}
无效的
附加(A::ptr e)
{
(*b)。元素。推回(e);
}
静态boost::python::class\u
包裹()
{
返回bp::class_(“ElementProxy”,bp::no_init)
.def(“\uuuu len\uuuuu”,&ElementProxy::len,
(bp::arg(“self”),
“返回包含的元素数”
)
.def(“\uuuu getitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,
(bp::arg(“自我”),bp::arg(“我”),
“返回给定索引处的元素”
)
.def(“append”,&ElementProxy::append,
(bp::arg(“自我”)、bp::arg(“元素”),
“附加元素”
)
;
}
私人:
B::ptr B_;
};
BOOST_PYTHON_模块(foo){
bp::A类(“A”);
ElementProxy::wrap();
bp::第二类(“B”)
.add_属性(“元素”、&ElementProxy::init);
}
如果您的操作系统是linux,您可能会遇到以下错误:
如果呼叫
export-LD\u-PRELOAD=
在启动程序修复它之前,这就是它。您需要替换为计算机上的实际路径。类似于/usr/lib/gcc/i686pclinuxgnu/4.1.2/libstdc++.so.6
这个错误只出现在一些图形驱动程序和发行版中,但它非常普遍。特别是,它在Ubuntu 11.04中得到了修复。你能把它简化为一个最小的代码示例吗?能够看到它,并可能测试它,将有助于试图找出它的很多。修改问题,包括一个。在这种特殊情况下,崩溃发生在循环之后,在实际框架中,它发生在第一次
for
迭代之后。谢谢你的关注。可能没有直接的帮助,但是。。通常认为“从某个模块导入*”是个坏主意。也许可以尝试导入您所需的内容?这是一个很好的建议,但仍然没有成功:((例如,OpenGL导入GL的仍然崩溃)