ctypes 类成员访问段错误
ctypes class member access segfaulting
我对在python中使用c ++类感兴趣。看看从python调用C/C++?,我决定尝试ctypes。但是,当我尝试更改类成员的值时,我会出现段错误。
这是一个重现我问题的简单示例:
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(); }
}
该代码在 OSX 上编译为:
g++ -c -fPIC foo.cpp -o foo.o && g++ -shared -Wl -o libfoo.dylib foo.o
蟒蛇方面:
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,我会得到段错误。
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 位指针问题。
相关文章:
- 为什么PyImport_ImportModule python 3.7.2 中出现段错误?
- 为什么在访问 vtkRenderWindow 的"交互器"变量时会发生段错误?
- 全局向量导致 C++ 程序结束时出现段错误
- 为什么重载运算符<<打印特征类成员会导致段错误?
- 更改条件段错误
- 使用 TTF_RenderText() 加载字体时获取段错误 TTF_OpenFontRW()
- 注册对对象工厂的调用会导致段错误
- pthread_create在构造函数段错误中
- Nanoflann发现邻居提出段错误
- C++ 中的构造函数、继承、堆栈、堆、this-pointer 和段错误
- 具有unique_ptr的 CRTP 会导致段错误
- 增强纤维work_stealing屏障会导致段错误
- 当我返回指向结构的指针向量时出现段错误
- C++为什么我的代码没有爆炸/段错误?
- Pthread段错误,使用指向main中变量的指针
- C++ 模板中的段错误
- 相当于Windows/MSVC上的段错误?
- 为什么我的 LLVM JIT 实现出现段错误?
- 为什么访问我的引用捕获变量会导致我的 lambda 函数出现段错误?
- 为什么自删除的全局 Vulkan 实例仅在添加层时才导致段错误?