1. ホーム
  2. c++

[解決済み] C++でdelete[]構文が存在するのはなぜですか?

2022-08-01 17:59:29

疑問点

について質問されるたびに delete[] について質問するたびに、「C++ ではこうなっている。 delete[] というような反応があります。 バニラ C のバックグラウンドから来ると、私が理解できないのは、なぜ異なる呼び出しがまったく必要なのかということです。

とは malloc() / free() の場合、選択肢は連続したメモリブロックへのポインタを取得することと、連続したメモリブロックを解放することです。 実装の土地で何かがやってきて、あなたが割り当てたブロックがベースアドレスに基づいてどのようなサイズであったかを、あなたがそれを解放しなければならないときのために知っています。

関数がありません。 free_array() . これに接する他の質問で、おかしな説を見たことがあります、例えば、呼び出しのための delete ptr を呼び出すと配列の先頭だけが解放され、配列全体は解放されない。 あるいは、より正しいのは、それは実装によって定義されていない、というものです。 そして、確かに...これがC++の最初のバージョンで、あなたが奇妙な設計上の選択をしたのであれば、それは意味があることです。 しかし、なぜ $PRESENT_YEAR の標準的なC++では、それがオーバーロードされていないのでしょうか?

C++が追加する余分なビットは、配列を通過してデストラクタを呼び出すことだけのようです。たぶんこれが肝心で、文字通り別の関数を使って、一回の実行時の長さのルックアップを節約しているのだと思います、あるいは nullptr をリストの最後に追加することで、すべての新しい C++ プログラマーや、曖昧な一日を過ごして別の予備の単語があることを忘れてしまったプログラマーを苦しめることと引き換えに、私たちは別の関数を使っています。

誰か、"それが標準が言っていることであり、誰もそれに疑問を持たない" 以外の理由があるのかどうか、きっぱりと明らかにしてもらえませんか?

どのように解決するのですか?

C++のオブジェクトは、その寿命の終わりに実行する必要があるデストラクタを持つことがよくあります。 delete[] は、配列の各要素のデストラクタが呼び出されることを確認します。しかし、これを行うことで は不特定のオーバーヘッドがあります。 一方 delete はそうではない。これが、delete式に2つの形式がある理由です。一つは配列のためのもので、これはオーバーヘッドを払い、もう一つは単一オブジェクトのためのもので、これは払いません。

1つのバージョンしか持たないようにするためには、実装はすべてのポインタについて余分な情報を追跡するためのメカニズムが必要になります。しかし、C++の基本原則の1つは、ユーザーが絶対に必要でないコストを支払うことを強制されるべきではないということです。

常に delete 何を new そして常に delete[] 何を new[] . しかし、現代のC++では newnew[] は一般に使われなくなりました。使用方法 std::make_unique , std::make_shared , std::vector など、より表現力が豊かで安全な代替手段を用いることができます。