学習したときC99常にmalloc
の戻り値をチェックして成功したか失敗したかをチェックするように言われましたが、今では学習を始めましたC++と私キーワードnew
を使用してこれを行う必要はなく、常に機能するものと想定できます。
しかし、それはなぜですか?
編集:いくつかの回答を受け取り、try
とcatch
を使用するように言われましたが、C#では、try and catchを頻繁に使用してキャッチエラーはプログラムを遅くし、パフォーマンスに影響を与えます。それはC++に当てはまりますか?
New
はメモリを割り当て、オブジェクトの初期化のためにコンストラクターを呼び出します。失敗すると例外をスローしますstd::bad_alloc
。 malloc
はメモリを割り当て、コンストラクターを呼び出しません。割り当てに失敗した場合はnull
ポインターを返すため、そこから何が得られるかを確認する必要があります。ただし、C++では、new
が常に機能するとは限りません。機能しない場合は、例外がスローされると想定できます。
C++では、高度な機能を使用しない限り、new
演算子でメモリを割り当てることができない場合、例外がスローされるため、new
によって取得されたポインターがnullであるかどうかを確認する必要はありません。か否か。例外の処理はプログラマに任されています。そうしないと、プログラムが突然終了します。この例外を適切に処理し、メモリまたはリソースリークなしで操作を再開するのは実際にはトリッキーです。そのため、new
およびdelete
を使用したオブジェクトの割り当ては廃止されたと見なされます。コンテナーとスマートポインターを使用することをお勧めします。
malloc()
のラッパーを使用すると、Cでも同じ動作が得られることに注意してください。
_#include <stdio.h>
#include <stdlib.h>
void *xmalloc(size_t size) {
void *p = malloc(size);
if (p == NULL) {
fprintf(stderr, "malloc failed for %zu bytes\n", size);
exit(1);
}
return p;
}
_
xmalloc()
によるメモリ割り当ての失敗をチェックする必要はありません。そのような失敗はプログラムの突然の終了を自動的に引き起こすためです。このアプローチは、障害が壊滅的なものではなく、対話的に処理できるコマンドラインユーティリティに使用できます。
戻り値を確認するには多くの方法があります。
私は2番目と3番目が好きです。