最初に述べた関数セットを使って、9.1 節の例を Python ヒープに I/O バッファをメモリ確保するように書き換えたものを 以下に示します:
PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf... */ res = PyString_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;
同じコードを型対象の関数セットで書いたものを以下に示します:
PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf... */ res = PyString_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;
上の二つの例では、バッファを常に同じ関数セットに属する関数で 操作していることに注意してください。 実際、あるメモリブロックに対する操作は、異なるメモリ操作機構を 混用する危険を減らすために、同じメモリ API ファミリを使って行うことが 必要です。以下のコードには二つのエラーがあり、そのうちの一つには 異なるヒープを操作する別のメモリ操作関数を混用しているので 致命的 (Fatal) とラベルづけをしています。
char *buf1 = PyMem_New(char, BUFSIZ); char *buf2 = (char *) malloc(BUFSIZ); char *buf3 = (char *) PyMem_Malloc(BUFSIZ); ... PyMem_Del(buf3); /* Wrong -- should be PyMem_Free() */ free(buf2); /* Right -- allocated via malloc() */ free(buf1); /* Fatal -- should be PyMem_Del() */
素のメモリブロックを Python ヒープ上で操作する関数に加え、 PyObject_New()、 PyObject_NewVar()、および PyObject_Del() を使うと、 Python におけるオブジェクトを メモリ確保したり解放したりできます。またこれらの関数には マクロ PyObject_NEW()、 PyObject_NEW_VAR()、 および PyObject_DEL() が対応します。
これらの関数については、次章の C による新しいオブジェクト型の定義や 実装に関する記述の中で説明します。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。