一般的にダイナミックアロケーションは許可されず、例外は許可されない安全ソフトウェアを検討してください。動的割り当ては、クラスexplicityが演算子new
とdelete
を定義している場合にのみ許可されます。オペレータnew
を他のクラスに使用すると、コンパイルに失敗します。一方では、標準ライブラリとこの原因の副作用をグローバルオペレータのないベアメタルnew
void* operator new(std::size_t) = delete;
:
説明した状況では、コンパイルの失敗を引き起こすための最も簡単な方法は、グローバルnew演算子を削除することです。例えば、<array>
を含めると、<new_allocator>
に包含され、<stdexcept>
となります。 <new_allocator>
は::new
演算子を使用するため、例外とメモリ割り当てを使用しない場合でもビルドに失敗します。 Scoot Meyersによると、<array>
は素人フレンドリーでなければなりません。
一方、内蔵オペレータ
src/main.cpp:91:31: error: deleted definition of 'void* operator new(std::size_t)'
void* operator new(std::size_t) = delete; ^
<built-in>: note: previous declaration of 'void* operator new(std::size_t)'
コンパイラでこの原因エラーが::new
を禁止して<array>
を使用するための任意の解決策はありますか?
グローバルに::new
を禁止するソリューションはありますかにすべて?
リンク時に少し遅れてエラーが発生してもよろしいですか? –
@Marcビルドにまったく失敗した解決策は大丈夫です。 –
Cにはたぶん良い理由があります。これはそれらの1つのように聞こえる。 Cは隠れたオーバーヘッドを生成しません。 「新」は唯一の問題ではないが、不注意もトラブルにつながる可能性がある。割り込みハンドラやその他のタイムクリティカルなパスの場合 – Olaf