Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pybind11:将类所有权转移到C++;论建构 我遇到一个问题,Python类是使用pybd11从C++基础类派生的,它被立即销毁(垃圾收集)。我想C++对动态分配的对象拥有所有权,但我似乎无法实现。我已尝试保持_活动,将共享的_ptr作为py::class_uu模板参数传递,并将py::return_value_策略传递。。。什么都没用。我怀疑这只是用户错误_Python_C++_Wrapper_Pybind11 - Fatal编程技术网

Pybind11:将类所有权转移到C++;论建构 我遇到一个问题,Python类是使用pybd11从C++基础类派生的,它被立即销毁(垃圾收集)。我想C++对动态分配的对象拥有所有权,但我似乎无法实现。我已尝试保持_活动,将共享的_ptr作为py::class_uu模板参数传递,并将py::return_value_策略传递。。。什么都没用。我怀疑这只是用户错误

Pybind11:将类所有权转移到C++;论建构 我遇到一个问题,Python类是使用pybd11从C++基础类派生的,它被立即销毁(垃圾收集)。我想C++对动态分配的对象拥有所有权,但我似乎无法实现。我已尝试保持_活动,将共享的_ptr作为py::class_uu模板参数传递,并将py::return_value_策略传递。。。什么都没用。我怀疑这只是用户错误,python,c++,wrapper,pybind11,Python,C++,Wrapper,Pybind11,这是一个简化的真正问题,我有一个更大的代码库,架构类似。更改体系结构不是一个选项,因此使这个示例工作对我来说至关重要 我有两个C++类,我使用pybDun11创建了Python接口。类A和B都有虚拟方法,所以它们有相应的trampoline类来支持继承。用户调用B::Run()函数,这将导致动态分配(通过新建)要创建的对象。当我在python中创建这两个类的专门化时,如下所示。。。。分段错误,因为调用B::Run后,B::aBase立即被销毁 有没有办法解决这个问题?提前谢谢 class A {

这是一个简化的真正问题,我有一个更大的代码库,架构类似。更改体系结构不是一个选项,因此使这个示例工作对我来说至关重要

我有两个C++类,我使用pybDun11创建了Python接口。类A和B都有虚拟方法,所以它们有相应的trampoline类来支持继承。用户调用B::Run()函数,这将导致动态分配(通过新建)要创建的对象。当我在python中创建这两个类的专门化时,如下所示。。。。分段错误,因为调用B::Run后,B::aBase立即被销毁

有没有办法解决这个问题?提前谢谢

class A
{
public:
    A(){};
    virtual ~A()
    {
        std::cout << "In A::~A()\n";
    };

    virtual char* SayHello()
    {
        char* x = "\n\nHello from Class A\n\n";
        return x;
    }
};

class ATramploline : public A
{
public:
    using A::A;
    char* SayHello() override
    {
        PYBIND11_OVERLOAD( char*,A,SayHello,);
    }
};


class B
{
public:
    B()
    {
        std::cout << "In Class B Constructor\n";
    }

    void Run()
    {
        aBase = AllocateAnAClass();
        std::cout << aBase->SayHello();
    }

    virtual ~B()
    {
        fprintf(stderr,"About to delete aBase");
        delete aBase;
    }

    A* aBase;

    virtual A* AllocateAnAClass()
    {
        return new A;
    }
};

class BTramploline : public B
{
public:
    using B::B;
    A* AllocateAnAClass() override
    {
        PYBIND11_OVERLOAD( A*,B,AllocateAnAClass,);
    }
};

PYBIND11_MODULE(TestModule,m)
{
    py::class_<A,ATramploline>(m,"A")
        .def(py::init<>(),py::return_value_policy::reference_internal)
        .def("SayHello",&A::SayHello);

    py::class_<B,BTramploline>(m,"B")
        .def(py::init<>())
        .def("Run",&B::Run)
        .def("AllocateAnAClass",&B::AllocateAnAClass,py::return_value_policy::reference_internal);
}



#!/usr/bin/python3

from TestModule import A,B
class MyA(A):
    def __init__(self):
        super().__init__()
        print("Done with MyA Constructor")

    def SayHello(self):
        return '\n\nHello from Class MyA\n\n'

class MyB(B):
    def __init__(self):
        super().__init__()
        print("Done With MyB Constructor")
    def AllocateAnAClass(self):
        print("In MyB::AllocateAnAClass!!!")
        return MyA()

#x = B()
#x.Run()

y = MyB()
y.Run()

print("done with test script\n")
A类
{
公众:
A(){};
虚拟~A()
{
std::cout使用
std::shared\u ptr
作为
A
持有者的正确(我认为)方法是将其添加到
class
参数中

您还希望将
A*
的每个实例替换为
std::shared_ptr
,将
new
替换为
std::make_shared
。我认为在这种情况下不需要非默认返回策略,因此我已将它们删除;YMMV

下面的工作模块(已更正小错误)

#包括
#包括
#包括
名称空间py=pybind11;
甲级
{
公众:
A(){};

(const A&{std::coutpy::nodelete是解决方案。虽然n.m的答案确实有效,但它需要返回并将现有库中的所有指针更改为智能指针,这对我来说不是一个可行的选项。使用py::nodelete允许我在pybind11端执行所有操作

py::class_<A,ATramploline,std::unique_ptr<A,py::nodelete> >(m,"A")
        .def(py::init<>())
        .def("SayHello",&A::SayHello);
py::class_m(A)
.def(py::init())
.def(“SayHello”,&A::SayHello);

SWIG与此有什么关系?请提供一个最小但完整的示例。这是一个最小但完整的示例
py::class_<A,ATramploline,std::unique_ptr<A,py::nodelete> >(m,"A")
        .def(py::init<>())
        .def("SayHello",&A::SayHello);