5

私はメモリプロファイラーを作成しようとしていますが、これまでのところ、カスタム関数を malloc、free、new、delete で機能させることができました。と を使用して、オーバーロードされた new メソッド内でオリジネーターをログに記録しよう__FILE____LINE__しましたが、(予想どおり) オーバーロードされた関数の場所の詳細が表示されるだけです。テスト対象のコンポーネントの既存のコードを変更せずに、オーバーロードされた関数のオリジネーターに関する詳細を取得する方法はありますか (malloc の #define など)。

私が使用している関数は次のとおりです。

void* operator new (size_t size)
{
    if(b_MemProfStarted)
    {
        b_MemProfStarted = false;
        o_MemLogFile << "NEW: " << "| Caller: "<< __FILE__ << ":"
                << __LINE__ << endl;
        b_MemProfStarted = true;
    }

    void *p=malloc(size);
    if (p==0) // did malloc succeed?
    throw std::bad_alloc(); // ANSI/ISO compliant behavior

    return p;
}

bool b_MemProfStarted は、ofstream と map.insert での再帰呼び出しを避けるために使用されます。

4

2 に答える 2

4

あなたは書ける

new(foo, bar) MyClass;

この場合、次の関数が呼び出されます

void*operator new(std::size_t, Foo, Bar){
    ...
}

これで電話できます

new(__LINE__, __FILE__) MyClass;

とデータを使用します

void*operator new(std::size_t, unsigned line, const char*file){
    ...
}

マクロの追加

#define new new(__LINE__, __FILE__)

監視対象のコードに対して、ソースコードを変更することなくほとんどの呼び出しをキャッチします。

たとえば、演算子を直接newと呼ぶことができるため、完全ではありません。その場合、プリプロセッサはコードをガベージに変えます。しかし、私にはこれ以上の方法はありません。

于 2009-09-08T17:39:50.227 に答える
0

いいえ、できません

#define new new(__FILE__, __LINE__)

しかし、あなたはすることができます:

#define DEBUG_NEW new(__FILE__, __LINE__)
#define new DEBUG_NEW

見てください: http://sourceforge.net/projects/nvwa/

于 2009-09-08T22:17:12.957 に答える