2017-07-04 18 views
10

newおよびdelete異なるコンパイラおよび異なるC++標準を使用してコンパイルすると、演算子のオーバーロードが機能しない場合があります。それは正常な行動ですか?C++新規および削除のオーバーロード

次のコードを使用してコンパイラをテストしました。

#include <iostream> 

void * operator new(size_t size) 
{ 
    std::cout << "1\n"; 
    return malloc(size); 
} 

void operator delete(void *ptr) noexcept 
{ 
    std::cout << "2\n"; 
    free(ptr); 
} 

int main(void) 
{ 
    int *n1 = new int; 
    delete n1; 

    int *n2 = new int[10]; 
    delete[] n2; 

    return 0; 
} 

は、ここで私は、私が上でコードをテストしているいくつかのコンパイラから得た結果です。

mingwの-W64公式ビルド - x86_64-7.1.0リリース - POSIX-SEH-rt_v5-rev0.7z

c++11 
1 
2 

c++14 
1 

打ち鳴らすのx86_64版 - 手動

上記のコンパイラを使用してパッチなしで構築されたv4.0.0
c++11 and c++14 
1 
2 

MSVC - プラットフォームツールセットV141 & SDKのv10.0.15063.0

/std:c++14 and /std:c++latest 
1 
2 
1 
2 

すべてのテストはWindows 7で実行されます.VMを設定していないため、GNU/Linux OSでコンパイラをテストすることはできません。規格によって

+0

あなたの例ではうまくいかないのですか? –

+1

[]バージョンをオーバーロードする必要があります:http://en.cppreference.com/w/cpp/memory/new/operator_newシグネチャは標準の変更で変更され、異なるコンパイラを異なる標準でテストし、異なる結果をもたらすでしょう。 –

+1

@RichardCritten msvcコンパイラで[]演算子をオーバーロードする必要はありません。上記のmsvcの結果を参照してください。 – MoodyMoon

答えて

2

は、両方operator new[]のデフォルトの動作は、([new.delete.array]/4)である:

戻りoperator new(size)、又はoperator new(size, alignment)、それぞれ。同様の

何かoperator delete[]([new.delete.array]/15)のために行く:

sizeパラメータを指定せずに前方に対応する機能への他のパラメータをsizeパラメータを持つ関数。 sizeパラメータを持たない関数は、パラメータを対応するoperator delete(単一オブジェクト)関数に転送します。

これらの関数のデフォルトバージョンは、単純に非配列フォームを呼び出します。したがって、Visual StudioとGCC 6.3は正しいです。非配列バージョンをオーバーロードするだけでは、アロケータに過負荷がかかります。

関連する問題