4

削除しようとしているマップへのポインタがあります(このマップにはnewが割り当てられています)。

このマップは有効だと思います。デバッグ中にカーソルを合わせると、次のように表示されpMapます[0]()

この空のマップを削除しようとすると、アプリが終了し、

myapp.exeの0xsomelocationでの初回例外:0xsomenumber:呼び出されたオブジェクトがクライアントから切断されました。

出力ウィンドウで。これは何を意味するのでしょうか?

ありがとう..

編集:ここにいくつかのサンプルコードがあります:

typedef map<const char*, StructA*, StructB> myMap;
typedef vector<myMap *> myMapStack;

StructBにはオーバーロードされた演算子があります() 編集:StructBは確かに構造体です、申し訳ありませんが、演算子()は単なる文字列比較関数です。

私のコードのある部分では、クラスのコンストラクターがメソッドを呼び出します。それをInitClass()と呼びましょう。これにより、myMapポインターが次のように初期化されます。

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;
}

奇妙な..コードに何か問題があるかもしれませんが、まだどこにあるのかわかりません..コード全体を投稿すると大きすぎる(そしておそらく解雇されるでしょう)ので、そのままにしておきましょうそれで..

問題の原因となったのは、クリアまたは削除しようとしたnullマップへのポインターであった可能性があります。

助けようとしたすべての人に感謝します...:)

4

6 に答える 6

5

さて、あなたのサンプル コードには多くの問題があります。マップを次のようにインスタンス化すると、事態はうまくいきませ<const char*, StructA*, StructB*> ん。値の代わりにマップにポインターを格納する理由はありますか? std::mapとにかく、追加した要素をヒープに保存する可能性があります。std::stringまた、の代わりに使用する必要がありconst char*ます。その場合、コンパレーターをポインターとして渡す理由はまったくありません。

繰り返しますが、これはあなたに当てはまりますmapStack(スタックが必要な場合は、スタックを使用しないのはなぜですか?)。オブジェクトを共有していないか、純粋仮想基底クラスを使用していない限り、ポインターを使用する理由はありません。また、ポインターを使用する必要がある場合は、生のポインターを使用しないようにしてください。

newこれらのエラーを解決した後、またはを使用する理由はないはずですdelete

于 2010-03-01T09:30:13.867 に答える
1

正直なところ、実際のコードが投稿されていなければ、私たちはどこにも行かないと思います。

投稿されたスニペットに限らず、コードが間違った場所が101か所ある可能性があります。

示されているオブジェクトの挿入と削除の実装から、構文や論理エラーはありません。ソースコードがここで共有するのに非常に価値がある場合は、問題を実証するのに十分簡単なダミープロジェクトを作成してみてください(問題がダミープロジェクトに存在しない場合は、間違った方向に取り組んでいることがわかります)

于 2010-03-01T13:57:01.687 に答える
1

コードが利用できないので、暗闇の中でのショット。ポインタがマップの配列ではなく単一のマップを指していることを確認しますか(この場合はを使用する必要がありますdelete [])?

于 2010-03-01T09:10:28.773 に答える
1

pop_back() を実行する前に、削除を実行する必要があります。

于 2010-03-01T09:31:19.787 に答える
1

明日がないかのようにポインターを投げています。最も可能性の高い説明は、割り当て解除された (ただし null ではない) ポインターを介して書き込むことにより、マップ構造を破壊していることです。その他の提案については、pmr の回答を参照してください。必要がない限り、ポインターを使用しないでください。コードで、マップ オブジェクトではなくマップ ポインターを処理する理由はほとんどありません。

于 2010-03-01T10:04:31.820 に答える
1

この問題を引き起こす可能性のあるコード (投稿したコード) については何もないので、エラー文字列を Google で調べたところ、COM に関係があることがわかりました。

この投稿が役に立ちます: エラー 0x80010108 (呼び出されたオブジェクトがクライアントから切断されました) の原因は何ですか?

質問とは関係ありません:これは興味深いと思います:

typedef map<const char*, StructA*, StructB*> myMap;

3 番目のテンプレート パラメーターは構造体ポインターですか? プレーンなクラス/タイプでなければならないと思いました。

于 2010-03-01T13:01:54.847 に答える