0

演算子 new[] を次のようにオーバーライドしました

void* operator new[](std::size_t sz, const char *file, int line)

{
    void* mem = malloc(sz);

    if(mem == 0){
            printf("Could not allocate the desired memory, the new operator fails\n");
            std::abort();
        }
    printf("Allocation has been done!\n");
    printf("Allocation has been done! In %s, line #%i, %p[%i]\n", file, line, mem, sz);
    return mem;

}
#define DEBUG_NEW2 new[](__FILE__, __LINE__)
#define new[] DEBUG_NEW2

私のプログラムは主にこのタイプの new 演算子を使用しているため、私はそれについてもっと心配しています。ただし、コンパイラは「マクロ名 [-Werror] の後に空白がありません」というエラー メッセージを表示します。「#define new[] DEBUG_NEW2」で遊んでみました。場合によっては問題なくコンパイルできますが、その場合は new[] がオーバーライドされません。

4

1 に答える 1

2

ここでの問題は、で始まる行です#define new[]

という名前のマクロを作成しようとしていますnew[]

まず、マクロ名は有効な識別子である必要があるため、これは違法です。つまり、文字、アンダースコア、数字のみを含み、数字で始まることはできません。

第二に、キーワードに新しい意味を与えようとしています。これは許可されておらず、プログラムが無効であるか、未定義の動作をすることを意味します。

演算子 new[] をオーバーロードするためにそのようなマクロを追加する必要はありません。実際、必要なvoid* operator new[](size_t)スコープ内のシグネチャを持つ関数を宣言するだけで、配列の割り当てのために自動的に呼び出されます。

于 2013-01-29T16:43:24.020 に答える