9.3 例

最初に述べた関数セットを使って、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 による新しいオブジェクト型の定義や 実装に関する記述の中で説明します。

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。