Boost.Python+;OpenGL分割错误 我有一个(几乎)完美的C++代码,用Boost.Python编写的。它包装了一个由3个或4个类组成的基于指针的共享结构层次结构,没有什么非常复杂的东西(例如,类a有一个由类B实例指针组成的std::vector,等等),顶层包称为foo

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

不久前,我决定使用PyOpenGL将可视化添加到项目中。所以现在,每当我有代码>导入OpenGL<代码>之前,我有<代码>导入FoO < /C> >,我在C++代码中得到了分割错误(例如当我迭代对象序列和它们的子对象时) 我最好的假设是OpenGL以某种方式替代了内存分配函数,或者做了类似的不神圣的事情。有人能解释一下情况吗?我会尽力按要求提供更多细节,但整个事情似乎相当混乱

根据要求,独立测试用例:

生成文件:

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的
仍然崩溃)