4

通常は gcc (g++) でコンパイルされる長時間実行される C++ プログラムがあります。valgrind を使用してメモリ リークがないことを確認したので、リーク検出器を探しているわけではありません。

ただし、私が懸念しているのは、メモリの断片化と、一時バッファー/オブジェクトの不要な新規/削除のペアです。

new へのすべての呼び出しをログに記録し (STL コンテナー内で発生した場合でも)、スタック トレースを提供してコード内で追跡できるようにする方法はありますか? 私は mtrace を試しましたが、それは C++ にのみ適用されます。責任のあるコード行を調べると、すべての割り当てがグローバルな新しいアロケーターで行われていると言ってしまいます。どういうわけか、valgrind の memcheck は、メモリ割り当てのスタック トレースを表示するという点で、私が望むほとんどのことを行うことができます。残念ながら、それらは、一致する割り当て解除なしで、割り当てのためにのみレンダリングされるようです。

4

2 に答える 2

6

したがって、割り当てに関する追加の統計を追跡したい場合は、グローバルな新規/削除関数をいつでもオーバーライドできます。

void* operator new (size_t size)
{
    void *pPtr = alloc_memory(size); /* perform the allocation here but don't use new! */

    if(pPtr == 0)
        throw std::bad_alloc();

    /* additional code here to do whatever sort of tracking you want */
    return pPtr;
}

void operator delete (void *pPtr)
{
    if(pPtr == 0)
        return; // legal to call delete on NULL pointers - don't pass NULL to free()

    /* additional code to do whatever tracking you want here */
    free(pPtr); 
}

バックトレースの取得に関しては、それはコンパイラと O/S に依存しており、取得する標準的な方法はありません。GCCについて言及しているので、次のことがうまくいくかもしれません:

http://tombarta.wordpress.com/2008/08/01/c-stack-traces-with-gcc/

于 2012-06-16T08:58:19.450 に答える