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.0c++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でコンパイラをテストすることはできません。規格によって
あなたの例ではうまくいかないのですか? –
[]バージョンをオーバーロードする必要があります:http://en.cppreference.com/w/cpp/memory/new/operator_newシグネチャは標準の変更で変更され、異なるコンパイラを異なる標準でテストし、異なる結果をもたらすでしょう。 –
@RichardCritten msvcコンパイラで[]演算子をオーバーロードする必要はありません。上記のmsvcの結果を参照してください。 – MoodyMoon