4

長期の python プログラマーであり、初めての C++ 拡張機能ライターです。とにかく、楽しみのために、C++ で Python 用のリンク リスト モジュールを作成しようとしています。これが私のコードです

#include <python2.7/Python.h>
#include <iostream>

using namespace std;

template <typename T>
class LinkedList : public PyObject {
private:
  struct ListNode {
    ListNode(T value, ListNode* next)
      : value(value), next(next) {}
    T value;
    ListNode* next;
  };
  ListNode* head;

public:
  LinkedList(T value)
    : head(new ListNode(value, 0)) {
    cout << "class constructed" << endl;
    Py_INCREF(this);
  }
  void get_value() {
    cout << "test" << endl;
  }
  ~LinkedList() {
    delete head;
    Py_DECREF(this);
    cout << "class destructed" << endl;
  }
};

static PyObject* linkedlist_new(PyObject* self, PyObject* args) {
  LinkedList<char*> ll("hello");
  return Py_BuildValue("O", &ll);
}

static PyMethodDef LinkedListMethods[] = {
    {"new", linkedlist_new, METH_VARARGS,
     "Create a new linked list."},
    {NULL, NULL, 0, NULL}
};

extern "C" PyMODINIT_FUNC initLinkedList(void) {
  (void) Py_InitModule("LinkedList", LinkedListMethods);
}

これはできますか?ほとんどのドキュメントは C 用ですが、PyObject から継承してこのように返すことはできますか? 現在機能しているのは次のとおりです。

import LinkedList

print "start"
l = LinkedList.new()
print "done"

しかし、Python を呼び出すとすぐにl.get_value()、segfault が発生します。私がやっていることはおそらく間違っていることを知っているので、誰かが私を正しい方向に向けてくれますか?

LinkedList<char*>明確にするために、関数の実行後に「ll」という名前が破棄されることを知ってlinkedlist_newいます。これは、私が抱えている問題の一部です。私が非常に、非常に迷っているとしましょう...

4

1 に答える 1