#include <new>
(このエラーはis defined in the <new>
headerであるため)がないにもかかわらず、プログラム内のnew
式がbad_alloc
というエラーをスローする可能性がありますか?<new>ヘッダーが定義されていませんが、新しいthrow bad_alloc?
から3.7.4。 N3337:
ライブラリには、グローバル割り当て機能と割り当て解除機能のデフォルト定義が用意されています。いくつかのグローバル割り当ておよび解放機能は置き換え可能です(18.6.1)。 C++プログラムは、置き換え可能な割り当てまたは割り当て解除関数を最大で1つ定義しなければならない。このような関数定義は、ライブラリ(17.6.4.6)で提供されるデフォルトのバージョンに置き換わります。次の割り当て関数と解放関数(18.6)は、プログラムの各翻訳単位でグローバルスコープで暗黙的に宣言されます。
void* operator new(std::size_t); void* operator new[](std::size_t); void operator delete(void*); void operator delete[](void*);
これらの暗黙の宣言は、関数名のみ
operator new
、operator new[]
、operator delete
、およびoperator delete[]
をご紹介します。 [注:暗黙の宣言では、std
、std::size_t
、またはこれらの名前を宣言するためにライブラリが使用する他の名前はありません。したがって、ヘッダ<new>
を含まないこれらの関数の1つを参照する新しい式 delete-expressionまたは関数呼び出しは形式の整ったものです。しかし、std
またはstd::size_t
を参照すると、適切なヘッダーを含めることによって名前が宣言されていない限り、正しく構成されません。 -end note]割り当ておよび/または割り当て解除関数も宣言し、任意のクラスに対して定義することができます
これはまだ私には分かりません。暗黙の宣言はstd::size_t
を使用しますが、それらを導入しません(bad_alloc
の場合も同じです)。 std::size_t
は、new
式を使用する前に導入する必要はありませんか?これはどういう意味ですか、それとも額面でそれを取らなければなりませんか?
さて、あなたは ''を含む標準C++ライブラリにリンクしているので、 'std :: bad_alloc'について知っています。 –
C++の標準ヘッダーに他のC++標準ヘッダーを含めることは正式に許可されているという事実と関係しているかもしれませんが、これらの機能に関する限り、それはすべての話ではないと思います。 –
いくつかの実験の後、私はこれが事実であると結論づけます。私はそれについての答えを書くつもりです。 –