1

今日、メモリ リーク検出に関するソース コードを見つけ、彼のヘッダー ファイルに次のマクロ定義を見つけました。

#ifndef MC_NO_REDEFINITION
    #define new MC_NEW
    #define MC_NEW new(__FILE__,__FUNCTION__,__LINE__)
        #define mc_new new
else
//use defined function name instead of keyword new & delete
    #define debug_new new(__FILE__,__FUNCTION__,__LINE__)
#endif  

これが意味すること、new が表すことnew(__FILE__,__FUNCTION__,__LINE__)、これが true の場合、コードで new を使用するときに本当に呼び出したいものをコンパイラがどのように認識するのでしょうか?

4

2 に答える 2

5

これらのマクロを提供する同じコードはoperator new()、次のような適切な追加引数を取るグローバルの適切な定義も提供する必要があります。

void * operator new(std::size_t n, char const * file, char const * func, char const * line)
{
    // log file, func, line

    return operator new(n);
}

一致する もあるはずoperator delete()です。

はキーワードであることに注意してくださいnew。キーワードをマクロに置き換えることは、実際には標準によって容認されていないと思います。

于 2012-09-09T14:00:36.777 に答える
2

newはキーワードであり、キーワードをマクロに置き換えることは、実際には標準では容認されていないと思います。

絶対的に正しい。その結果、未定義の動作が発生します。これは、模倣してはならないMicrosoftのハックです。

于 2012-09-09T16:30:37.467 に答える