レガシーコードを見ていると、次のコードに似たものが見つかりました
void* legacy_type::operator new(size_t size) {
return pool_alloc(size);
}
pool_alloc は、失敗した場合に決してスローせず、0 を返すことが知られています。
ここでは、 new の std::nothrow バリアントのオーバーロードはありません。
このコードが意味的に正しく、動作が明確に定義されているかどうかは疑問です。
new (std::nothrow) legacy_type;
カスタムの pool_alloc を使用する必要がありますか? 私のコンパイラでは、まったくコンパイルされません。それは明確に定義された動作ですか?
this==0
オーバーロードoperator new
がゼロを返す場合、コンストラクターを実行してクラッシュさせる必要がありますか? 私のコンパイラでは実行されます(メンバーの初期化時にクラッシュします)。それは標準的な明確に定義された動作ですか?