#
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 による新しいオブジェクト型の定義や 実装に関する記述の中で説明します。