2

new演算子とdelete演算子をオーバーロードしました。'old'へのポインタを保存し、それを'new'newとにdelete呼び出したい。例えば:newdelete

#include "h.h"
void * operator new ( size_t size, /*args*/ ) throw (std::bad_alloc)
{
    void * p = 0;
    p = original_new(size); //calling for 'old' new
    //some code
    return p;
}

そして、同様の演算子delete

だから、私はヘッダーファイルに次のように入力しようとしています:

static void * (*original_new)(size_t) = ::operator new;
static void * (*original_new_arr)(size_t) = ::operator new[];
static void (*original_delete)(void *) = ::operator delete;
static void (*original_delete_arr)(void *) = ::operator delete[];

正常にコンパイルされましたが、起動時にコアダンプがあります。悪いと呼ぶことは可能ですmallocそれnewは本当に悪い考えです。電話をかけることは可能ですnew(std::nothrow)が、それも悪いことです。

4

1 に答える 1

2

ポインタを保存する必要はありません。operator new配置の新しい演算子(複数の引数を取る関数)を定義して も、既存の演算子は削除されません。それはそれらをオーバーロードするだけです。配置演算子new関数から標準演算子new関数を呼び出すには:

p = ::operator new( size );

newの配置が、によって返された正確なアドレス以外のものを返す場合は、これを実行したくないことに注意してください::operator new。そうし ないと、機能しdeleteません。によって返されるポインタ以外のものを返す新しい配置を使用する場合は::operator new、新しいグローバルを定義する必要がありますoperator delete(これが呼び出されるため)。つまり、新しい標準 operator newも定義する必要があります。新しいで正しく動作するように operator delete。すべてのメモリ管理を自分で実装する必要をなくすために、実装で使用mallocfreeます。

于 2011-12-19T10:16:45.200 に答える