我通过添加一个私有成员变量并在函数中打印它来扩展这个答案bar()
中提供的示例:
#include <iostream>
class Foo{
private:
double m;
public:
Foo() { m = 2.344; };
void bar(){
std::cout << "Hello, number is " << m << std::endl;
}
};
extern "C" {
Foo* Foo_new(){ return new Foo(); }
void Foo_bar(Foo* foo){ foo->bar(); }
}
包装器ctypes
没有改变,是:
from ctypes import *
lib = cdll.LoadLibrary('./libfoo.so')
class Foo(object):
def __init__(self):
self.obj = lib.Foo_new()
def bar(self):
lib.Foo_bar(self.obj)
f = Foo()
f.bar()
当我运行 python 代码时(在之前已经编译了 C++ 代码之后),我遇到了一个分段错误,我已经缩小到m
in的打印范围bar()
。
段错误没有发生
- 在原始代码中
- 如果我删除打印
m
但将其保留为变量 - 如果我
m
用bar()
.
我真的很困惑为什么会发生这种情况。由于这是一个学习 ctypes 的实验,任何帮助将不胜感激。