BREW での operator new, operator delete

BREW では標準ライブラリが使えないので、new と delete は自前で override する必要がある。
で、自分の知っている BREW の本には、

void* operator new(size_t size)
{
    return MALLOC(size);
}

void operator delete(void* ptr)
{
    FREE(ptr);
}

void* operator new[](size_t size)
{
    return MALLOC(size);
}

void operator delete[](void* ptr)
{
    FREE(ptr);
}

こうやって書いてあるんだけれども、このプログラムはあまりよろしくない。


C++ の規約では、new する際の引数 size に 0 が渡された場合でも正常にメモリを確保出来なければならない。このままだと null を返してしまう。
また、null ポインタに対する delete も正常に動作しなければならない。このままだと不正アクセスを起こして端末リセットが掛かってしまう。
あと、operator new を定義する際にしなければならない処理としては例外処理があるけれど、BREW では例外を使用出来ないので、そこは気にしなくて良い。


で、ちゃんと規約を守って書くのであれば、次のようにする。

void* operator new(size_t size)
{
    if (size == 0)
    {
        size = 1;
    }
    return MALLOC(size);
}

void operator delete(void* ptr)
{
    if (ptr != null)
    {
        FREE(ptr);
    }
}

void* operator new[](size_t size)
{
    if (size == 0)
    {
        size = 1;
    }
    return MALLOC(size);
}

void operator delete[](void* ptr)
{
    if (ptr != null)
    {
        FREE(ptr);
    }
}

この辺は、Effective C++の第2版8項及び第3版51項で説明されている。
特に、「null に対する delete は何もしない」というのはかなり強力なルールなので、ここは絶対にやっておきたいところ。