web-dev-qa-db-ja.com

C ++、新しいvs mallocの戻り値

学習したときC99常にmallocの戻り値をチェックして成功したか失敗したかをチェックするように言われましたが、今では学習を始めましたC++と私キーワードnewを使用してこれを行う必要はなく、常に機能するものと想定できます。

しかし、それはなぜですか?

編集:いくつかの回答を受け取り、trycatchを使用するように言われましたが、C#では、try and catchを頻繁に使用してキャッチエラーはプログラムを遅くし、パフォーマンスに影響を与えます。それはC++に当てはまりますか?

5
clark_smith1

Newはメモリを割り当て、オブジェクトの初期化のためにコンストラクターを呼び出します。失敗すると例外をスローしますstd::bad_allocmallocはメモリを割り当て、コンストラクターを呼び出しません。割り当てに失敗した場合はnullポインターを返すため、そこから何が得られるかを確認する必要があります。ただし、C++では、newが常に機能するとは限りません。機能しない場合は、例外がスローされると想定できます。

1
Wippo

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()によるメモリ割り当ての失敗をチェックする必要はありません。そのような失敗はプログラムの突然の終了を自動的に引き起こすためです。このアプローチは、障害が壊滅的なものではなく、対話的に処理できるコマンドラインユーティリティに使用できます。

0
chqrlie

戻り値を確認するには多くの方法があります。

  • nothrowバージョンを使用している場合は、返されたポインタを確認できます
  • より高いレベルでtryブロックを使用できます
  • set_new_handlerを使用して、すべてのnewのハンドルをチェックできます。

私は2番目と3番目が好きです。

0
Surt