Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.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
ctypes类成员访问分段错误 我对在Python中使用C++类感兴趣。看着,我决定试试ctypes。但是,当我尝试更改类成员的值时,会出现SEGFULT_C++_Python_C_Ctypes - Fatal编程技术网

ctypes类成员访问分段错误 我对在Python中使用C++类感兴趣。看着,我决定试试ctypes。但是,当我尝试更改类成员的值时,会出现SEGFULT

ctypes类成员访问分段错误 我对在Python中使用C++类感兴趣。看着,我决定试试ctypes。但是,当我尝试更改类成员的值时,会出现SEGFULT,c++,python,c,ctypes,C++,Python,C,Ctypes,下面是一个重现我的问题的简单示例: C/C++端: #include <iostream> class Foo{ private: int mValue; public: void bar(){ std::cout << "Hello" << std::endl; } void setValue(int inValue) { mVa

下面是一个重现我的问题的简单示例:

C/C++端:

#include <iostream>

class Foo{
    private:
        int mValue;
    public:
        void bar(){
            std::cout << "Hello" << std::endl;
        }
        void setValue(int inValue) {
            mValue = inValue;
            std::cout << "Value is now: " << mValue << std::endl;
        }
        void setValue2() {
            mValue = 2;
            std::cout << "Value is now: " << mValue << std::endl;
        }
};

extern "C" {
    Foo* Foo_new(){ return new Foo(); }
    void Foo_bar(Foo* foo){ foo->bar(); }
    void Foo_setValue(Foo* foo, int v) { foo->setValue(v); }
    void Foo_setValue2(Foo* foo) { foo->setValue2(); }
}
python方面:

from ctypes import *
lib = cdll.LoadLibrary('./libfoo.dylib')

class Foo(object):
    def __init__(self):
        self.obj = lib.Foo_new()
    def bar(self):
        lib.Foo_bar(self.obj)
    def set(self, v):
        lib.Foo_setValue(self.obj, v);
    def set2(self):
        lib.Foo_setValue2(self.obj);
我可以毫无问题地调用bar,但如果调用set或set2,我会得到SEGFULT

f = Foo()
f.bar()  # Ok
f.set(3) # Segfault

显然,我遗漏了一些东西

使用以下方法解决了问题:

def __init__(self):
    lib.Foo_new.restype = c_void_p # Needed
    self.obj = lib.Foo_new()

def set(self, v):
    lib.Foo_setValue(c_void_p(self.obj), v) # c_void_p needed

综上所述,这似乎是一个64位指针问题

具体地说,我使用了链接帖子中的精确编译参数:
g++-c-fPIC foo.cpp-o foo.o
g++-shared-Wl,-soname,libfoo.so-o libfoo.so foo.o
,以及加载
/libfoo.so
刚刚在Linux机器上试用过,正如您所说的那样。然而,在OSX 10.7.4和10.6.8上,我得到了SEGFULT。似乎是一个特定于平台的问题。似乎是这样。另外,我注意到你没有处理你在C++部分中分配给<代码> MValue/Cuff>的内存。我知道这只是一个示例代码来说明segfault,但仍然是。您还可以使用
lib.Foo\u setValue.argtypes=[c\u void\u p,c\u int]
来声明参数类型。这样,您就不必每次使用参数时都对其进行包装。
def __init__(self):
    lib.Foo_new.restype = c_void_p # Needed
    self.obj = lib.Foo_new()

def set(self, v):
    lib.Foo_setValue(c_void_p(self.obj), v) # c_void_p needed