問題タブ [double-free]

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 投票する
3 に答える
3005 参照

c++ - 文字列代入での二重解放または破損エラー

ここで文字列の割り当てにエラーがあります。これは、URL から取得したデータを格納するためにコーディングした関数です。編集:データノード構造

行 page_node->url = url が Double free または破損の原因であり、データは参照ではなく値によって渡されます。誰かが何がうまくいかないのか指摘できますか?

ありがとう、私は構造をクラスにしました、そして問題は完全に解決されました。ありがとう!しかし、malloc を使用した構造メモリ管理が C++ で問題になる理由については、まだ疑問に思っています。構造体は、c++ で非常に頻繁に使用されます。

0 投票する
2 に答える
2749 参照

c++ - 2 つのサードパーティ共有ライブラリにリンクすると C++ プログラムがクラッシュする

Linux プラットフォーム用に 2 つの外部委託共有ライブラリがあります (ソースもドキュメントもありません)。ライブラリは、個別にプログラムにリンクされている場合 (g++ xx.cpp lib1.so、または g++ xx.cpp lib2.so)、正常に動作します。

ただし、C++ プログラムがこれら 2 つの共有ライブラリに同時にリンクされると、プログラムは「二重解放」エラー (g++ xx.cpp lib1.so lib2.so) で必然的にクラッシュします。

C++ プログラムが空のhello world プログラムであり、これらのライブラリとは関係がない場合でも、クラッシュします。

メイクファイル:

これらの lib1.so lib2.so ライブラリがいくつかの共通グローバル変数を共有し、いくつかの変数を 2 回破棄する可能性があるという手がかりを得ました。gdb と valgrind を試しましたが、バックトレースから有用な情報を抽出できません。

これら 2 つの共有ライブラリを分離して、サンドボックスのように機能させる方法はありますか?

EDITED(コアダンプとgdbバックトレースを追加):

前述のおもちゃの空の helloword プログラムを 2 つのライブラリにリンクしました (プラットフォーム: centos 7.0 64bits with gcc4.8.2):

ヴァルグラインド:

gdb バックトレース メッセージ:

アップデート

@RaduChivu の助けに感謝します。非常によく似たシナリオを見つけました。 プログラムの終了時に __tcf_0 でセグメンテーション違反が発生し、実際に 2 つのライブラリ間でグローバル変数の衝突が発生しているように見えます。これら 2 つの外部共有ライブラリのソース ファイルがないことを考えると、2 つの別個のプロセスを使用する場合を除いて、この競合を解決できる他の方法はありますか?

0 投票する
2 に答える
1221 参照

c++ - std::shared_ptr の use_count をインクリメントするすべての方法は何ですか?

shared_ptr同じ を指す2 つの があります。intつまり、それらを呼び出すget()と同じアドレスが返されます。しかし、それらを呼び出すuse_count()と が返されます1。それらの最後のものが範囲外になると、もう一方によってすでに解放されているメモリを解放しようとするため、二重解放の実行時エラーが発生します。

このバリアントでも、明示的に宣言された raw ポインターを使用して同じことが起こります。

両方の s が同じものを指している場合、 がuse_count()返される1(返されない) のはなぜですか? が返された場合、 2 回解放しようとしたのはなぜですか? a は、その兄弟の s と同じアドレスを指している場合にのみ、1増加すると考えました。2shared_ptruse_count()1intshared_ptruse_countshared_ptr

のは、生std::shared_ptrのポインタ (またはデフォルトで構築されている場合は生のポインタへの代入) によるuse_count最初の の構築によってのみインクリメントされ、その後、追加の のコピー構築または前の のいずれかによる代入によってインクリメントされますか? また、インクリメントする他のすべての方法は何ですか?shared_ptrshared_ptrshared_ptr

0 投票する
2 に答える
489 参照

c++ - ダブルフリーまたは破損-なぜですか?

メインで 2 つの行列を作成しようとすると、最初の次元が 2 番目の次元よりも低くなり、ダブル フリーが発生します。両方の行列の次元が同じ場合、または最初の行列の次元が 2 番目の行列よりも大きい場合、問題はありません。誰かがコードを見て、何が問題なのか教えてくれるでしょうか?

編集:メイン:

0 投票する
1 に答える
146 参照

c - 2D 配列の割り当て解除時のダブル フリー エラー

私は、フィールドとして 2 次元配列を持つ構造体を使用するプログラムに取り組んでいます。しかし、何らかの理由で毎回 free_planet 関数を使用しようとすると、二重解放エラーが発生します。プログラムを valgrind として使用すると、問題は行 49 から 51 までの命令にあるようですが、その理由はわかりません。

0 投票する
1 に答える
2612 参照

c++ - C++ でフォークされたプロセスを正しく終了する

How to end C++ code への回答を読んで、 C++ コードexitからの呼び出しが悪いことを知りました。しかし、どこかで終了する必要があり、呼び出しスタックの奥深くにある子プロセスを fork した場合、その終了コードを main に渡すことは不可能でしょうか?

私はそれを行う方法をいくつか見つけました - 確かに、これは少し長くなりましたが、我慢してください:

オプション 0

おそらく最悪:

問題は、 std::exitが自動ストレージを持つオブジェクトを単純に無視するため、 testinのデストラクタがfork_option0呼び出されないことです。さらに悪いことに、デストラクタが2 回呼び出されます。unique_ptr

オプション1

std::_Exitは自動ストレージも無視するfork_option1ため、デストラクタと同じ問題があります。少なくとも、デストラクタは 1 回だけ呼び出されます。unique_ptr

オプション 2

これはうまくいくようです。デストラクタは正しく呼び出されます。

オプション 3

これは主なアドバイスからの戻り値に最も近い近似値ですが、いくつかの問題があります。

のデストラクタfork_option3は正しく呼び出されますが、2 つの二重解放が発生します。最初はunique_ptr、2 番目は のオブジェクトですfork_this

オプション 4

unique_ptrのダブルフリーがなくなったため、オプション 3 よりもわずかに優れています。ただし、オブジェクトfork_thisはまだ二重に解放されています。

では、子プロセスを終了/終了する適切な方法は何ですか?

上記の実験から、オプション 2 が最適に機能するように思われます。ただし、他の問題を見逃している可能性があります( C++ コードの終了方法をstd::_Exit参照) 。