[解決済み] C++でdelete[]構文が存在するのはなぜですか?
疑問点
について質問されるたびに
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++では
new
と
new[]
は一般に使われなくなりました。使用方法
std::make_unique
,
std::make_shared
,
std::vector
など、より表現力が豊かで安全な代替手段を用いることができます。
関連
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] なぜ ++[[]][+[] +[+[]] は "10" という文字列を返すのでしょうか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】'cout'は型名ではない
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] delete[]が配列であることをどうやって知るのですか?