std ::マップを削除する(ビジュアルC ++)
-
23-09-2019 - |
質問
私は(このマップは、新しいで割り当てられた)を削除しようとしていることをマップへのポインタを持っています。
デバッグ中に私はホバーその上に、それが示したときにこのマップは、私が思うに有効ですpMap
:[0]()
..
私はこの空のマップを削除しようとすると、私のアプリはちょうど終了し、私が取得
myapp.exeで0xsomelocationで出力ウィンドウに初回例外:0xsomenumber:そのクライアントから切断されました呼び出されたオブジェクト
。この意味ですか?
何おかげ..
EDITます:
:ここではいくつかのサンプルコードがありますtypedef map<const char*, StructA*, StructB> myMap;
typedef vector<myMap *> myMapStack;
StructBはオーバーロードオペレータ()
を有します
編集:StructBは確かに構造体です、申し訳ありませんが、演算子()単なる文字列比較機能です..
は私のコードのいくつかの部分では、クラスのコンストラクタは、メソッドを呼び出し、のは非常に似MYMAPポインタを初期化しInitClass()、それを呼びましょう
pMyMap = new myMap; // I also tried this with new myMap()
// this pointer is then pushed onto the a map stack
pMyMapStack.push_back(pMyMap);
後で、このクラスのデストラクタで、私は行く
pMyMap = pMyMapStack.back();
pMyMapStack.pop_back();
delete pMyMap; // after I step over this line the app quits.. and displays that message
おかげ
編集:私は戻って働いていたコードの古いバージョンに戻って、それは今も元気に働いている..
どのように働いたことは、このようなものでした
// after the pMyMapStack.pop_back()
int x = pMyMap->size();
if (x >= 0)
delete pMyMap;
以前、私はこれにそれを変更した上でます:
// after the pMyMapStack.pop_back()
int (x = pMyMap->size();
if (x >= 0){
pMyMap->clear();
delete pMyMap;
}
私はそれの全体のコードを掲載場合は、奇妙な..そこのコードで何か他の間違っているかもしれないが、まだ...それが大きすぎる(と私はおそらくクビだろう)ここで、私はちょうど把握することはできませんちょうどその時にそれを残してみましょう..
私は問題を引き起こしていた私がクリアしようとしていたという帰マップへのポインタまたは削除されているかもしれないと思う..
...助けようとしたすべての人のための感謝:)
解決
正直、私たちは実際のコードなしで何もどこ行くのだと思いませんが掲示ます。
のコードが間違っていた101の場所があるかもしれません、投稿スニペットに限定されない。
図示オブジェクトの挿入および除去の実装からは、いかなる構文にも論理的誤りが存在しません。 ソースコードはここに共有することがとても貴重だった場合、(問題はダミーのprojに存在しない場合、あなたは間違った方向に取り組むている知っている)
問題を実証するためのシンプルなことに、ダミーのプロジェクトを作成してみてください他のヒント
さて、あなたのサンプルコードで問題がたくさんあります。 <const char*, StructA*, StructB*>
:あなたのようにマップをインスタンス化するとき物事はゆがんで行くを開始します
あなたの代わりに値をマップ内のポインタを格納するための理由はありますか?
std::map
はとにかくヒープ上にそれに追加要素を格納する可能性があります。また、あなたはstd::string
の代わりにconst char*
を使用する必要があります。次に、ポインタとしてコンパレータに合格する理由は全くありません。
は再びこれはあなたのmapStack
についても同様です。限り、あなたは、オブジェクトを共有するか、純粋仮想基底クラスを使用していないとして使用ポインタに理由はありません。あなたはポインタを使用する必要がある場合や、生のポインタを使用しないようにしてください。
new
またはdelete
を行うためのいかなる理由があってはならないこれらのエラーを出してきました。後ます。
暗闇の中でだけでショット、何のコードが利用できないため。あなたは必ずポインタを単一のマップにあるといない(あなたがdelete []
を使用する必要があり、その場合には)マップの配列?
あなたはpop_backを(実行する前に削除を行う必要があります)。
あなたの周りのポインタを投げています。最も可能性のある説明は、あなたが割り当て解除(しかし、非ゼロに)ポインタを通して書き込むことによって、あなたのマップ構造をつかうしていることです。より多くの提案をPMRの回答を参照してください。あなたがする必要がある場合を除き、ポインタを使用しないでください。地図のポインタではなく、マップオブジェクトを扱うためにあなたのコードに少し理由があります。
あなたのエラー文字列のために、この問題I Googleで検索を引き起こし、COMを行うには、それの何かを発見した可能性があなたのコードについて何も(あなたが投稿していること)ありませんので。
この記事はあなたを助けることができます: 何であってもよいですエラー0x80010108が(そのクライアントから切断された起動されたオブジェクト)の原因か
の質問には関係ありません。 私はこの興味深いを見つけます:
typedef map<const char*, StructA*, StructB*> myMap;
どのようにあなたの第三テンプレートは、構造体のパラメータのポインタのでしょうか?私はそれは、プレーンクラス/タイプでなければならないであろうと想定ます。