この回答で提供されている例を、プライベートメンバー変数を追加して拡張し、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()
m
Python コードを実行すると (以前に C++ コードをコンパイルした後で)、セグメンテーション違反が発生し、 inの印刷に絞り込まれましたbar()
。
セグフォルトが発生しない
- 元のコードで
- 印刷を削除
m
して変数として保持する場合 m
の任意の固定数に置き換える場合bar()
。
なぜこれが起こるべきなのか、私は本当に困惑しています。これは ctypes を学習するための実験であるため、ご協力いただければ幸いです。