C++ 返回指向llvm::Value的指针时boost::python崩溃

C++ 返回指向llvm::Value的指针时boost::python崩溃,c++,llvm,boost-python,python-extensions,C++,Llvm,Boost Python,Python Extensions,我有一个函数,它返回一个llvm::Value*,我想向Python公开它。我不需要将接口公开给llvm::Value;它可以是Python中的不透明对象 当我调用该函数时,会发生崩溃。(我将提供下面的堆栈)。如果我将指针包装在一个带有auto_ptr的普通结构中,则不会发生崩溃。我正在运行MacOS X并使用darwin gcc工具链进行编译 代码如下: #include <boost/python.hpp> #include <memory> #include "l

我有一个函数,它返回一个
llvm::Value*
,我想向Python公开它。我不需要将接口公开给
llvm::Value
;它可以是Python中的不透明对象

当我调用该函数时,会发生崩溃。(我将提供下面的堆栈)。如果我将指针包装在一个带有
auto_ptr
的普通结构中,则不会发生崩溃。我正在运行MacOS X并使用darwin gcc工具链进行编译

代码如下:

#include <boost/python.hpp>
#include <memory>

#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/LLVMContext.h"

namespace python = boost::python;

struct Wrapper {
    std::auto_ptr<llvm::Value> val;

    Wrapper(llvm::Value* val):val(val) {}
};

llvm::Value* getValue() {
    llvm::Value* v = llvm::ConstantFP::get(llvm::getGlobalContext(), llvm::APFloat(2.5));
    v->dump();
    return v;
}

Wrapper* getWrapper() {
    llvm::Value* v = llvm::ConstantFP::get(llvm::getGlobalContext(), llvm::APFloat(3.5));
    v->dump();
    return new Wrapper(v);
}

BOOST_PYTHON_MODULE(TestCase) {
    // functions 
    // (note that the same issue still persists if 
    // return_value_policy is reference_existing_object).

    python::def("getValue",   &getValue,   python::return_value_policy<python::manage_new_object>());
    python::def("getWrapper", &getWrapper, python::return_value_policy<python::manage_new_object>());

    // classes
    python::class_< llvm::Value, boost::noncopyable >("LLVMValue", python::no_init);
    python::class_< Wrapper,     boost::noncopyable >("Wrapper",   python::no_init);
}
和堆栈:

0   libc++abi.dylib                 0x00007fff919cb78a __cxxabiv1::__si_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const + 0
1   libstdc++.6.dylib               0x000000010df5294b __dynamic_cast + 104
2   TestCase.so                     0x000000010bad66be _object* boost::python::detail::wrapper_base_::owner_impl<llvm::Value>(llvm::Value const volatile*, mpl_::bool_<true>) + 57 (wrapper_base.hpp:64)
3   TestCase.so                     0x000000010bad6487 _object* boost::python::detail::wrapper_base_::owner<llvm::Value>(llvm::Value const volatile*) + 29 (wrapper_base.hpp:37)
4   TestCase.so                     0x000000010bad63a0 _object* boost::python::to_python_indirect<llvm::Value*, boost::python::detail::make_owning_holder>::execute<llvm::Value>(llvm::Value const&, mpl_::bool_<false>) const + 36 (to_python_indirect.hpp:67)
...
0 libc++abi.dylib 0x00007fff919cb78a\uuuuuu cxxabiv1::\uuuu si\u类\u类型\u信息::具有明确的\u公共\u基(\uuuuuuuucxxabiv1::\uuuu动态\u cast\u信息*,void*,int)常量+0
1 libstdc++.6.dylib 0x000000010df5294b\u动态\u cast+104
2 TestCase.so 0x000000010bad66be_object*boost::python::detail::wrapper_base_::owner_impl(llvm::Value const volatile*,mpl_::bool_)+57(wrapper_base.hpp:64)
3 TestCase.so 0x000000010bad6487_object*boost::python::detail::wrapper_base_::owner(llvm::Value const volatile*)+29(wrapper_base.hpp:37)
4 TestCase.so 0x000000010bad63a0_object*boost::python::to_python_indirect::execute(llvm::Value const&,mpl_::bool_)const+36(to_python_indirect.hpp:67)
...
我是否误用了
boost::python
?这是虫子吗?为什么会崩溃?我希望不要到处包装包装,因为这需要对C++ API进行侵入性的更改。
0   libc++abi.dylib                 0x00007fff919cb78a __cxxabiv1::__si_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const + 0
1   libstdc++.6.dylib               0x000000010df5294b __dynamic_cast + 104
2   TestCase.so                     0x000000010bad66be _object* boost::python::detail::wrapper_base_::owner_impl<llvm::Value>(llvm::Value const volatile*, mpl_::bool_<true>) + 57 (wrapper_base.hpp:64)
3   TestCase.so                     0x000000010bad6487 _object* boost::python::detail::wrapper_base_::owner<llvm::Value>(llvm::Value const volatile*) + 29 (wrapper_base.hpp:37)
4   TestCase.so                     0x000000010bad63a0 _object* boost::python::to_python_indirect<llvm::Value*, boost::python::detail::make_owning_holder>::execute<llvm::Value>(llvm::Value const&, mpl_::bool_<false>) const + 36 (to_python_indirect.hpp:67)
...