問題タブ [delete-operator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
12 に答える
57462 参照

c++ - スタックに割り当てられた変数で削除を呼び出す

プログラミングスタイルと設計を無視して、スタックに割り当てられた変数で削除を呼び出すのは「安全」ですか?

例えば:

また

0 投票する
27 に答える
1549516 参照

javascript - JavaScript での配列要素の削除 - delete と splice

メソッドを使用するのではなく、配列要素で演算子を使用するdeleteことの違いは何ですか?Array.splice

例えば:

オブジェクトと同じように配列要素を削除できるのに、なぜ splice メソッドがあるのでしょうか?

0 投票する
5 に答える
81166 参照

c++ - 新規/削除のオーバーロード

私は自分のプログラムで小さなメモリ リーク ファインダーを作成していますが、new と delete (および new[] と delete[]) をオーバーロードする方法は何もしていないようです。

私がオーバーロードした方法newは、上記のコード スニペットに示されています。演算子が void* を返すことによるものだと思いますが、どうすればよいかわかりません。

0 投票する
10 に答える
35780 参照

c++ - 削除する前にNULLポインタをチェックする理由はありますか?

NULLポインタを削除する前にレガシーコードがチェックするのをよく見かけます。

NULLポインタを削除する前にポインタをチェックする理由はありますか?NULL後でポインタをに設定する理由は何ですか?

0 投票する
11 に答える
281607 参照

c++ - サブクラスへのポインタを削除すると、基本クラスのデストラクタが呼び出されますか?

class Aフィールドの 1 つにヒープ メモリ割り当てを使用する があります。クラス A はインスタンス化され、ポインタ フィールドとして別のクラスに格納されます ( class B.

クラス B のオブジェクトを使い終わったら、 を呼び出しますdelete。これは、デストラクタを呼び出すと想定しています...しかし、これはクラス A のデストラクタも呼び出すのでしょうか?

編集:

答えから、私はそれを取ります(間違っている場合は編集してください):

  1. deleteB のインスタンスの呼び出し B::~B();
  2. 呼び出すA::~A();
  3. A::~A deleteA オブジェクトのすべてのヒープ割り当てメンバー変数を明示的に指定する必要があります。
  4. 最後に、クラス B のインスタンスを格納しているメモリ ブロックがヒープに返されます。new使用されると、最初にメモリ ブロックがヒープに割り当てられ、次にコンストラクタが呼び出されて初期化され、すべてのデストラクタが呼び出されてオブジェクトがファイナライズされます。オブジェクトが存在したブロックはヒープに戻されます。
0 投票する
16 に答える
132718 参照

c++ - delete[] はそれが配列であることをどのように認識しますか?

よし、次のコードで何が起こるかは未定義であることに誰もが同意すると思う。

ポインターはあらゆる種類のものである可能性があるため、無条件で実行するdelete[]ことは未定義です。ただし、実際に配列ポインターを渡していると仮定しましょう。

私の質問は、ポインタが配列であるこの場合、これを知っているのは誰ですか? つまり、言語/コンパイラの観点からarrは、配列ポインターか単一の int へのポインターかどうかはわかりません。arr一体、動的に作成されたかどうかさえわかりません。それでも、代わりに次のことを行うと、

OS は、int を 1 つだけ削除し、その時点以降のメモリの残りを削除することによって、ある種の「大量殺戮」を行わないほど十分にスマートです (これを終了しstrlenていない\0文字列と比較してください。ヒット 0)。

では、これらのことを覚えるのは誰の仕事でしょうか? OS は何らかの種類の記録をバックグラウンドで保持していますか? (つまり、何が起こるかは未定だと言ってこの投稿を始めたことに気づきましたが、実際には、「殺戮」シナリオは起こらないので、実際の世界では誰かが覚えています。)

0 投票する
12 に答える
57973 参照

c++ - delete がポインターを NULL に設定しないのはなぜですか?

削除後の NULL へのポインターの自動設定が標準の一部ではないのはなぜだろうといつも思っていました。これが処理されれば、無効なポインターによるクラッシュの多くは発生しなくなります。しかし、標準がこれを制限した理由はいくつか考えられます。

  1. パフォーマンス:

    命令を追加すると、パフォーマンスが低下する可能性がありdeleteます。

  2. constポインターのせいかもしれません。

    次に、標準は、この特殊なケースに対して何かを行うことができたと思います。

これを許可しない正確な理由を誰かが知っていますか?

0 投票する
5 に答える
28236 参照

c++ - const へのポインタの削除 (T const*)

const ポインターに関する基本的な質問があります。const ポインターを使用して非 const メンバー関数を呼び出すことはできません。ただし、const ポインターでこれを行うことは許可されています。

これは、本質的に非定数の「メソッド」であるクラスのデストラクタを呼び出します。なぜこれが許可されているのですか?これをサポートするだけですか:

それとも他に何か理由があるのでしょうか?

0 投票する
5 に答える
5392 参照

c++ - delete はポインタの constness をどのように処理しますか?

この質問Deleting a const pointerを読んでいて、動作についてもっと知りたいと思っていましたdelete。さて、私の理解によると:

delete expression次の 2 つのステップで機能します。

  1. デストラクタを呼び出す
  2. free()次に、 operator delete を呼び出してメモリを解放します (多くの場合は を呼び出します)。

operator deleteを受け入れますvoid*。テスト プログラムの一部としてオーバーロードしたところ、ポインターを受け入れないことがoperator deleteわかりました。operator deleteconst

演算子 delete は const ポインターを受け入れず、delete は内部的に演算子 delete を呼び出すため、const ポインターの削除はどのように機能しますか?

delete内部で const_cast を使用していますか?

0 投票する
6 に答える
12108 参照

c++ - delete []はdeleteと同じですか?

自由に使ったら

そうでない場合、それはメモリリークにつながるのでしょうか?

これはVS2005によって生成された逆アセンブリコードです