問題タブ [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++ - ヒープが壊れているのはなぜですか?
エラーが発生しました - ヒープが破損しています。理由がわかりません。
私の拠点:
時間:
cpp :
アーミーデストラクタ:
私は何を間違っていますか?
c++ - キャスト時の C++ での削除の動作
私はいくつかの奇妙なコードに取り組んでいますが、私にとっては良いコードではありません。
ここで、 PIP_ADAPTER_INFO は構造体 IP_IP_ADAPTER_INFO へのポインタで、IP_IP_ADAPTER_INFO のサイズは 640 です。
delete []pAdapterInfo 呼び出しでクラッシュすることを予想していましたが、クラッシュはありませんでした。小さなテスト コードを書きました。
私が見るもの:
- c'tor と d'tor のコメントを外すと、テスト コードがクラッシュする (アサートが失敗する)
- コメントしたままにしておくと、何も失敗しません。
逆アセンブルが表示されていても、上記の両方のケースで異なります
C++ のこの機能を学ぶための専門知識を教えてください。
前もって感謝します。
土
c++ - オーバーロードされた削除でオブジェクトを削除する前の NULL チェック
これは、コード レビュー コメントの 1 つとして取り上げられました。
オブジェクトに対して delete を呼び出す前に NULL をチェックするのは良い考えですか?
delete 演算子が内部的に NULL をチェックし、冗長であることは理解していますが、演算子はオーバーロードされる可能性があるため、引数は delete であり、オーバーロードされたバージョンが NULL をチェックしない場合、クラッシュする可能性があります。では、delete がオーバーロードされた場合、いつオーバーロードされた場合に NULL をチェックするかどうかを確認するのは安全で合理的でしょうか? 私の理解では、オーバーロードされた削除がNULLチェックを処理する最初のケースを想定するのは合理的であり、レビューポイントは適切ではありません。どう思いますか?
c++ - C ++の削除演算子がポインタをNULLに設定しないのはなぜですか?
重複の可能性:
削除してポインタをNULLに設定しないのはなぜですか?
割り当て解除されたメモリへのポインタの目的はありますか?
c++ - 削除する前に、C++でvoidポインタをテストします
私はC++で配列を持っています:
これは、それが含まれるクラスのコンストラクターで初期化されます。
デストラクタには次のものがあります。
Valgrindを介してプログラムをテストする場合を除いて、voidポインターを削除するための呼び出しがいくつかあると表示されます。
このエラーを回避するために、deleteを呼び出す前に、playerArrayがvoidポインターであるかどうかをテストしたいと思います。
誰かがこれを行う方法を知っていますか?
c++ - 複数のポインタを安全に削除する方法
同じアドレスを指す多くのポインターを使用するコードがあります。同等の簡単な例を考えると:
複数の削除なしで安全に削除する方法は? すべて同じアドレスを指しているポインタを持つオブジェクトがたくさんある場合、これは特に困難です。
c++ - 複数のオブジェクトが指すメモリの複数のC++削除
別のC++ポインター削除の質問は、次の例にあります。
「deletef1」を呼び出したときにエラーが発生しなかったのはなぜですか?同じアドレス(* p)を2回削除しませんでしたか?
コードの最後の2行のポインターを直接削除すると、エラーが発生します。
c++ - 式を削除
ここを参照
そのデストラクタは、auto_ptr オブジェクトのデストラクタも暗黙的に呼び出します。そして、それが保持しているCオブジェクトを指すポインターを削除します-Cの定義を知らなくても!これは、構造体 A のコンストラクターが定義されている .cpp ファイルに表示されます。
これは興味深く、その後
5.3.5/5 は次のように述べています - 「削除されるオブジェクトが削除の時点で不完全なクラス型を持ち、完全なクラスに重要なデストラクタまたは割り当て解除関数がある場合、動作は未定義です。」
私の質問は、不完全な型へのポインターを削除しようとするようなプログラムが不正な形式として扱われないのはなぜですか? 条件付きの領域にプッシュされるのはなぜですか(そして完全なクラスには自明ではないデストラクタがあります..)「未定義の動作」ですか?
'と' は何を意味しますか?
編集2:
以下のコードは整形式ですか?VS と Gcc/CLang はコンパイルしますが、Comeau は警告を出します。これはすべて、標準で言及されている未定義の動作の一部だと思います。私の質問は、「なぜこれは不正ではないのに定義されていないのか」ということです。
c++ - オブジェクト指向の自殺またはこれを削除します。
MSVC9.0でコンパイルされた次のコードは、Destructorを4回実行して出力します。これは、論理的です。
mainの最初の4行のコードは、未定義の動作を引き起こさないと思います(ただし、完全にはわかりませんdelete this;
)。その確認または<確認の反意語のプレースホルダー>が欲しいのですが。しかし、5行目と6行目については深刻な疑問があります。デストラクタを明示的に呼び出すことは許可されていますね。しかし、オブジェクトの存続期間はその後終了したと見なされますか?つまり、デストラクタの明示的な呼び出し後の別のメンバーの呼び出しは許可されていますか(定義されています)?
要約すると、上記のコードのどの部分(存在する場合)が未定義の動作(技術的に言えば)をもたらしますか?
c++ - 「新しい」アイテムが削除されたことを検出する
このプログラムを検討してください。
私はクラッシュを予期していましたが、代わりにこれが起こりました:
こんにちは
さようなら
私は言います!
これは、メモリが割り当て解除としてマークされている場合、物理的にワイプされておらず、コードがそれをすぐに参照しているため、オブジェクトは完全に無傷でそこに残っているためだと思います。呼び出す前に割り当てがSpeak()
多ければ多いほど、クラッシュする可能性が高くなります。
理由が何であれ、これは私の実際のスレッドコードの問題です。上記の場合、現在のスレッドがアクセスしたいオブジェクトを別のスレッドが削除したかどうかを確実に判断するにはどうすればよいですか?