1

追加情報を収集してリストに保存する実装を作成しましたmalloc(これを と呼びます)。mymalloc(size_t)ここで、 ではなくoperator newで動作させるためにオーバーロードする必要があります。VS2010 では、次の実装を見つけました。mymalloc(size_t)malloc(size_t)operator new

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{       // try to allocate size bytes
    void *p;
    while ((p = malloc(size)) == 0)
        if (_callnewh(size) == 0)
        {       // report no memory
             static const std::bad_alloc nomem;
             _RAISE(nomem);
        }

        return (p);
}

参照:placement newこのコードにはありません! 次に、私の質問は次のとおりです。コンストラクターを呼び出すために、メモリ割り当て関数としてオーバーロードoperator newする方法は?mymalloc

4

2 に答える 2

6

operator new()(および)の仕事はoperator new[]()、オブジェクトを構築できるメモリへのポインタを提供することです。これらの演算子は、構築中のオブジェクトのコンストラクターを呼び出しません。実際、メモリが割り当てられている正確な型を知ることさえできません。クラス固有のものoperator new()がオーバーロードされていても、派生型でも使用されます。

operator delete()対応するandもオーバーロード/置換する必要があることに注意してくださいoperator delete[]()

于 2013-11-09T22:50:02.223 に答える
4

コンストラクターを呼び出すために何かをする必要はありません。コンストラクターは呼び出され、newメモリに注意する必要があります。

struct A
{
    void* operator new(size_t);
    //void operator delete(void*);

    A()
    {
        cout << "Constuctor is called" << endl;
    }
};

void* A::operator new(size_t size)
{
    cout << "New new is called" << endl;
    void *storage = malloc(size);
    if(0 == storage)
    {
        throw "allocation fail : no free memory";
    }
    return storage;
}

int main()
{
     new A;
}

出力

新しい新しいと呼ばれます

コンストラクターが呼び出されます

于 2013-11-09T22:47:16.590 に答える