問題タブ [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++ - グローバル名前空間スコープ解決演算子を使用してアクセスできる他のキーワードはありますか?
グローバルなnewとdeleteは通常のように使用できますが、::演算子をプレフィックスとして付けることもでき、同じように機能します。これと同じ動作をする他のキーワードはありますか?
c++ - std :: listは、ポインタのdeleteを呼び出して削除しますか?
理解できないセグメンテーション違反のため、プログラムでvalgrindを実行しました。ここで問題が検出されました...
除去はこの方法で行われます...
リストからポインタを削除しても、ポインタが必要になるとは思いませんでしdelete
た。ここで何が疑わしいですか?さらに詳しい情報が必要な場合はお知らせください。
PS以前、これをデバッグしたときに、GetTileXとGetTileYが有効なインデックスではなく、13775864のようなばかげた数値を返すために問題が発生したことに気付きました。ただし、これは問題に関連していると思いますdelete
。削除またはpush_backが問題の原因です。
編集:これは別のコードスニペットです
AdjustGridCoordがイテレータを無効にしている可能性がありますか?
c++ - オブジェクトを削除するとどうなりますか?(gcc)(double-deleteがクラッシュした場合?)
私は自分の質問で問題を解決したくないことに注意してください-私は物事が起こる可能性について考えていたので、何かについて疑問に思っていました:
オブジェクトを削除してgccをコンパイラとして使用するとどうなりますか?
先週、競合状態がオブジェクトの二重削除につながるクラッシュを調査していました。
オブジェクトの仮想デストラクタを呼び出すときにクラッシュが発生しました。これは、仮想関数テーブルへのポインタがすでに上書きされているためです。
仮想関数ポインタは最初の削除によって上書きされますか?
そうでない場合、その間に新しいメモリ割り当てが行われない限り、2番目の削除は安全ですか?
なぜ以前に問題が認識されなかったのか疑問に思っています。唯一の説明は、最初の削除中に仮想関数テーブルがすぐに上書きされるか、2番目の削除がクラッシュしないことです。
(1つ目は、「競合」が発生した場合に常に同じ場所でクラッシュが発生することを意味します。2つ目は、競合が発生しても通常は何も発生しません。その間に3番目のスレッドが削除オブジェクトを上書きした場合にのみ、問題が発生します。 )。
編集/更新:
テストを行いましたが、次のコードがsegfault(gcc 4.4、i686、amd64)でクラッシュします。
「仮想」をdtorから削除すると、ダブルフリーが検出されるため、プログラムはglibcによって中止されます。'virtual'を使用すると、仮想関数テーブルへのポインタが無効であるため、デストラクタへの間接関数呼び出しを実行するとクラッシュが発生します。
amd64とi686の両方で、ポインターは有効なメモリ領域(ヒープ)を指していますが、そこにある値は無効です(カウンター?非常に低い、たとえば0x11、0x21)ので、コンパイラーの場合は「呼び出し」(または「jmp」) return-optimizationを実行しました)無効な領域にジャンプします。
プログラム受信信号SIGSEGV、
セグメンテーション違反。0x0000000000000021
の ??()(gdb)
#
0 0x0000000000000021 in ?? ()
#
1 0x000000000040083e in main()
したがって、上記の条件では、仮想関数テーブルへのポインタは常に最初の削除によって上書きされるため、クラスに仮想デストラクタがある場合、次の削除はニルヴァーナにジャンプします。
c++ - C++標準のどこで::deleteは左辺値を変更できると言っていますか?
:: deleteに渡された左辺値を変更する最初のコンパイラーに遭遇しましたが、左辺値をゼロにしません。それは次のとおりです。
削除操作後のpはゼロではなく、古い値から変更されていることに注意してください。同僚は、pを0xFFFFFFFFに変更するメインフレームC ++コンパイラや、pを0に変更する他のコンパイラを使用した経験では、これは珍しいことではないと私に言いました。
C ++標準のどこで、コンパイラがこれを実行できると言っていますか?
StackOverflowを検索すると、次の質問が見つかりました。削除してポインタをNULLに設定しないのはなぜですか。これには、次のステートメントを含むBjarneStroustrupの応答を参照する回答がありました。
C ++では、削除の実装で左辺値のオペランドをゼロにすることが明示的に許可されており、実装でそれができることを期待していましたが、そのアイデアは実装者に普及していないようです。
最終委員会ドラフトC++0x標準のセクション5.3.5および12.5を読み直しましたが、「明示的な」部分が表示されていません。標準の間違ったセクションを見ているだけですか?または、セクションにロジックのチェーンがありますが、正しく接続されていません。
AnnotatedC++リファレンスマニュアルのコピーはもうありません。コンパイラがこれを実行できるのはARMでしたか?
[編集:セクション参照を3.5.3から5.3.5に修正。また、削除後にpが未定義であるというヘンクの主張に対する対位法として、興味深いパラドックスを追加しています。]
pがnullに初期化される場合、興味深いパラドックスがあります。
ただし、この場合、動作は十分に文書化されています。deleteがnullポインターを取得すると、何もしないと想定されるため、pは変更されません。
c++ - C++ の削除関数
関数の使用例: cpp で delete を見ましたが、完全には理解できませんでした。コードは次のとおりです。
コマンドの正確なアクションは何ですか: delete[] p;
?
目的は、コンテナ テーブル内のすべてのポインタを削除することだったと思います。
角かっこは、delete[]
Name へのポインターの配列を削除する手がかりを与えてくれますが、配列のサイズは指定されていません。では、デストラクタは削除するポインターの数をどのように「知る」のでしょうか?
c++ - C++ では、delete 演算子が呼び出されるとどうなりますか?
delete
C++ では、演算子が配列と共に使用されると、それを「破棄」し、使用したメモリを解放することを理解しています。しかし、これが行われるとどうなりますか?
私のプログラムは、再利用のために解放されたヒープの関連部分をマークオフして、続行すると考えました。
しかし、配列の最初の要素が null に設定され、他の要素は変更されていないことに気付きました。これはどのような目的に役立ちますか?
c++ - C ++でどのように「再割り当て」しますか?
realloc
C++ でどのようにすればよいですか? それは言語に欠けているようです - new
andはありますdelete
が、ありませんresize
!
プログラムがより多くのデータを読み取ると、それを保持するためにバッファーを再割り当てする必要があるため、これが必要です。delete
古いポインターを使用しnew
て新しい、より大きなポインターを使用することは正しい選択肢ではないと思います。
c++ - for_each を介して C++ のポインターのベクトルで「delete」を呼び出すことはできますか??
があるとしますstd::vector<Obj *> objs
(パフォーマンス上の理由から、実際の s ではなくポインターがありますObj
)。
obj.push_back(new Obj(...));
繰り返し入力します。
終わったらdelete
、押し戻された要素に取り掛かる必要があります。1つの方法はこれを行うことです:
for_each
ただし、アルゴリズムを使用して同じことができるかどうかに興味があります。
どう思いますか?
c++ - C ++の継承:デストラクタが呼び出されない
次のようなコードを取得しました。
私の問題は-推測-私のサーバーデストラクタが呼び出されないことです...
想像できません。理由:/ ...(3つのクラスすべてに出力関数を記述しましたが、サーバーコンストラクターは何も出力しませんが、他の両方は出力します... SECOND!キーを押した直後... (なぜ削除直後ではなく2番目なのですか?)
ヒント、ヒント、解決策はありますか?...
VisualStudio2010を使用しています
c++ - 提案されたビルドであるヒープのクリーンアップに関するC++規則に関する理論は、良い習慣ですか?
タイトルが示唆しているように、私は別の理論上の質問があります。それはコードのビルドを評価することです。基本的に、このテンプレートをどこでも使用することを検討しています。
VC ++ VS2008を使用しています(すべて含まれています)
Stapel.h
Stapel.cpp
ここでの焦点はクリーンアップメソッドです。基本的には、そのメソッドをすべてのファイルに配置し、必要に応じて削除呼び出しを実行して、すべてが1つの場所にあることを確認し、削除が飛び交うのを防ぐことができます。ルーキーとして、私でさえ、あなたがいじりたくないものでも、ずさんなヒープを持っているものでもないかもしれません。
このビルドはどうですか?
良し悪し ?なぜ ?
そして、そのようなタスクにデストラクタを使用するのはどうですか?