28

私は自分のプログラムで小さなメモリ リーク ファインダーを作成していますが、new と delete (および new[] と delete[]) をオーバーロードする方法は何もしていないようです。

void* operator new (unsigned int size, const char* filename, int line)
{
    void* ptr = new void[size];
    memleakfinder.AddTrack(ptr,size,filename,line);
    return ptr;
}

私がオーバーロードした方法newは、上記のコード スニペットに示されています。演算子が void* を返すことによるものだと思いますが、どうすればよいかわかりません。

4

5 に答える 5

56

ちょっとしたプリプロセッサ マジックを使って、やりたいことができるかもしれません。

#include <iostream>

using namespace std;

void* operator new (size_t size, const char* filename, int line) {
    void* ptr = new char[size];
    cout << "size = " << size << " filename = " << filename << " line = " << line << endl;
    return ptr;
}

#define new new(__FILE__, __LINE__)

int main() {
    int* x = new int;
}
于 2009-02-24T18:56:23.320 に答える
12

ここでの問題は、new のパラメーター プロファイルが標準のオペレーター new のパラメーター プロファイルと一致しないため、非表示にならない (したがって、まだ使用されている) ことだと思います。

新規および削除のパラメーター プロファイルは、次のようにする必要があります。

void* operator new(size_t);
void operator delete(void*, size_t);
于 2009-02-24T18:48:26.473 に答える
10
void* ptr = new void[size];

それはできません。修理する。

new/delete をグローバルにオーバーロードしようとしないでください。それらを基本クラスに入れ、このクラスからすべてのオブジェクトを派生させるか、名前空間またはテンプレート アロケーター パラメーターを使用します。なぜ、あなたは尋ねるかもしれません。プログラムが複数のファイルであり、STL やその他のライブラリを使用している場合、台無しになるからです。

newVS2005 からの operator の蒸留バージョンを次に示しnew.cppます。

void * 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);
}
于 2009-02-24T18:44:24.517 に答える
4

オーバーロードされた演算子を正しく呼び出していますか、つまり、追加のパラメーターを渡していますか?

于 2009-02-24T18:43:52.070 に答える
4

この問題は、オーバーロードされた new 演算子に追加した 2 つの引数に依存しています。filename と line を何らかの方法でグローバルにしてみてください (単一のクラスに対して new と delete をオーバーロードしている場合はメンバー変数)。その方がうまくいくはずです。

于 2009-02-24T18:45:07.043 に答える