2011-01-11 17 views
0

std::vectorsstd::mapsstd::shared_ptrsに構築しようとしていますが、データを失う癖があります。それで、std::shared_ptrsを入力すると、それらのうちのいくつかがポイントするデータが削除されます。std :: shared_ptrのベクトルデータを失う

具体的には、std::vectorにプッシュされる最初のstd::shared_ptrが削除されます。これは、元のstd::shared_ptrが範囲外になるまで、参照カウントをインクリメントする必要がある場合、std::vectorstd::shared_ptrを挿入すると混乱しますか?他のstd::shared_ptrsは削除されていないようですが、この問題が解決されるまでは、反復処理で値をチェックするまで確認できません。

自分自身について十分に説明していないと謝罪します。私はまだこのサイトに適応しています。

EDIT:Hereは、関連する2つのクラスのコードです。問題は、Loadメンバー関数にあるべきです。それはファイルパーサーなのでかなり大きいので、どこに問題があるのか​​は分かりません。値は、リストの場合はstd::vector<std::shared_ptr<NBT::Tag::Base>>、化合物の場合はstd::map<std::string, std::shared_ptr<NBT::Tag::Base>>のメンバ変数です。

+2

コードサンプルを投稿する可能性がありますか? boost :: shared_ptrで説明したことを真似しようとしましたが、正しく動作するようです。 – Dawson

+0

いくつかのコードを投稿できますか?あなたがしていることを正確に見ることなく、何が間違っているのかを見るのは難しいです。 – JaredC

+0

申し訳ありませんが、今投稿します。 10のクラスと1つの基本クラスがありますが、関連するクラスを投稿するだけです。 – OniLink

答えて

2

プログラムを実行してvalgrindを実行し、segfaultのソースを特定します。

+0

:なぜですか? –

+0

「valgrindを使用する」は答えではありません。 – nwp

2

あなたはshared_ptrを無駄に構築することはできません。それらは互いに構築する必要があります。共有スコープを共有しているだけだと思ってスコープから外に出たときにオブジェクトを削除します。 shared_ptrをオブジェクトから直接構築できるようにしたい場合は、enable_shared_from_this<Type>から継承する必要があります。私はあなたのコードを簡単に読むことはできませんが(そこにはたくさんあります)、あなたの症状はあなたがそれらを誤って作ったように私に聞こえます。

+0

新しいステートメントからstd :: shared_ptrを作成することはできませんか?私は新しい文から最初のshared_ptrを作成し、残りはそのshared_ptrからコピーされるからです。 – OniLink

+0

申し訳ありません、私はいくつかのデバッグを行って、それは、彼らが唯一の所有者だと思っているstd :: shared_ptrsの問題ではないように見えます。私はそれを削除することができた様々な場所でuse_countを使いました(通常、shared_ptrがスコープから外れようとしているとき)、そしてそれは常に1人以上の所有者を与えました。 – OniLink

+0

@OniLink:奇妙なことに、私が持っていた唯一のアイデアだった。 downvoterによってドライブに – Puppy

関連する問題