問題タブ [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.
c++ - スタックに割り当てられた変数で削除を呼び出す
プログラミングスタイルと設計を無視して、スタックに割り当てられた変数で削除を呼び出すのは「安全」ですか?
例えば:
また
javascript - JavaScript での配列要素の削除 - delete と splice
メソッドを使用するのではなく、配列要素で演算子を使用するdelete
ことの違いは何ですか?Array.splice
例えば:
オブジェクトと同じように配列要素を削除できるのに、なぜ splice メソッドがあるのでしょうか?
c++ - 新規/削除のオーバーロード
私は自分のプログラムで小さなメモリ リーク ファインダーを作成していますが、new と delete (および new[] と delete[]) をオーバーロードする方法は何もしていないようです。
私がオーバーロードした方法new
は、上記のコード スニペットに示されています。演算子が void* を返すことによるものだと思いますが、どうすればよいかわかりません。
c++ - 削除する前にNULLポインタをチェックする理由はありますか?
NULL
ポインタを削除する前にレガシーコードがチェックするのをよく見かけます。
NULL
ポインタを削除する前にポインタをチェックする理由はありますか?NULL
後でポインタをに設定する理由は何ですか?
c++ - サブクラスへのポインタを削除すると、基本クラスのデストラクタが呼び出されますか?
class A
フィールドの 1 つにヒープ メモリ割り当てを使用する があります。クラス A はインスタンス化され、ポインタ フィールドとして別のクラスに格納されます ( class B
.
クラス B のオブジェクトを使い終わったら、 を呼び出しますdelete
。これは、デストラクタを呼び出すと想定しています...しかし、これはクラス A のデストラクタも呼び出すのでしょうか?
編集:
答えから、私はそれを取ります(間違っている場合は編集してください):
delete
B のインスタンスの呼び出し B::~B();- 呼び出す
A::~A();
A::~A
delete
A オブジェクトのすべてのヒープ割り当てメンバー変数を明示的に指定する必要があります。- 最後に、クラス B のインスタンスを格納しているメモリ ブロックがヒープに返されます。newが使用されると、最初にメモリ ブロックがヒープに割り当てられ、次にコンストラクタが呼び出されて初期化され、すべてのデストラクタが呼び出されてオブジェクトがファイナライズされます。オブジェクトが存在したブロックはヒープに戻されます。
c++ - delete[] はそれが配列であることをどのように認識しますか?
よし、次のコードで何が起こるかは未定義であることに誰もが同意すると思う。
ポインターはあらゆる種類のものである可能性があるため、無条件で実行するdelete[]
ことは未定義です。ただし、実際に配列ポインターを渡していると仮定しましょう。
私の質問は、ポインタが配列であるこの場合、これを知っているのは誰ですか? つまり、言語/コンパイラの観点からarr
は、配列ポインターか単一の int へのポインターかどうかはわかりません。arr
一体、動的に作成されたかどうかさえわかりません。それでも、代わりに次のことを行うと、
OS は、int を 1 つだけ削除し、その時点以降のメモリの残りを削除することによって、ある種の「大量殺戮」を行わないほど十分にスマートです (これを終了しstrlen
ていない\0
文字列と比較してください。ヒット 0)。
では、これらのことを覚えるのは誰の仕事でしょうか? OS は何らかの種類の記録をバックグラウンドで保持していますか? (つまり、何が起こるかは未定だと言ってこの投稿を始めたことに気づきましたが、実際には、「殺戮」シナリオは起こらないので、実際の世界では誰かが覚えています。)
c++ - delete がポインターを NULL に設定しないのはなぜですか?
削除後の NULL へのポインターの自動設定が標準の一部ではないのはなぜだろうといつも思っていました。これが処理されれば、無効なポインターによるクラッシュの多くは発生しなくなります。しかし、標準がこれを制限した理由はいくつか考えられます。
パフォーマンス:
命令を追加すると、パフォーマンスが低下する可能性があり
delete
ます。
const
ポインターのせいかもしれません。次に、標準は、この特殊なケースに対して何かを行うことができたと思います。
これを許可しない正確な理由を誰かが知っていますか?
c++ - const へのポインタの削除 (T const*)
const ポインターに関する基本的な質問があります。const ポインターを使用して非 const メンバー関数を呼び出すことはできません。ただし、const ポインターでこれを行うことは許可されています。
これは、本質的に非定数の「メソッド」であるクラスのデストラクタを呼び出します。なぜこれが許可されているのですか?これをサポートするだけですか:
それとも他に何か理由があるのでしょうか?
c++ - delete はポインタの constness をどのように処理しますか?
この質問Deleting a const pointerを読んでいて、動作についてもっと知りたいと思っていましたdelete
。さて、私の理解によると:
delete expression
次の 2 つのステップで機能します。
- デストラクタを呼び出す
free()
次に、 operator delete を呼び出してメモリを解放します (多くの場合は を呼び出します)。
operator delete
を受け入れますvoid*
。テスト プログラムの一部としてオーバーロードしたところ、ポインターを受け入れないことがoperator delete
わかりました。operator delete
const
演算子 delete は const ポインターを受け入れず、delete は内部的に演算子 delete を呼び出すため、const ポインターの削除はどのように機能しますか?
delete
内部で const_cast を使用していますか?
c++ - delete []はdeleteと同じですか?
自由に使ったら
そうでない場合、それはメモリリークにつながるのでしょうか?
これはVS2005によって生成された逆アセンブリコードです