1

私は1つのマルチマップを作成ErrorMapし、このような値を挿入しました

map<char*,char*> ErrorMap;
ErrorMap.insert(map<char*, char*>::value_type(*l_itrList, ErrorMsg1));

この後、いくつかのリクエストを処理するために、このマップを 3 回読み込んでいます。削除する前にマップを印刷すると、最初の 2 つのペアの値が破損し、残りの値は問題ありません。

ここでコアダンプを取得しています。

読み取り中にこれらの値がどのように影響したかの詳細を取得できますか? 明示的に削除するまでマップを保存できるようにするためのソリューション。

私のログ

mapItrMov4.first (€J+) mapItrMov4.second (無効なサービス要求)

mapItrMov4.first (hK+) mapItrMov4.second (無効なサービス リクエスト)

mapItrMov4.first (最初) mapItrMov4.second (InvalidServiceRequest)

....

そしてその後は大丈夫です

gdb バックトレース

(gdb) ところで

/lib/tls/i686/libc.so.6 からの raise () の 0x001c2cae

/lib/tls/i686/libc.so.6 からの中止 () で 0x001c42b0

/lib/tls/i686/libc.so.6 からの __libc_message () の 0x001f2469

/lib/tls/i686/libc.so.6 からの _int_free () の 0x001f7ef8

/lib/tls/i686/libc.so.6 からの free () の 0x001f824f

/usr/lib/libstdc++.so.6 からの演算子 delete () の 0x004dbfd1

/usr/lib/libstdc++.so.6 からの演算子 delete[] () の 0x004dc01d

amsAccMgmtReqHandler::opServicesReqHandler の 0x080ab607 (this=0x95b91dc、m_Response=0x95ba588 "68287

amsAccMgmtReqHandler::handleRequest の 0x080b35c4 (this=0x95b91dc, a_cpRequestStr=0x2187820 "1< MSISDN>10200007358995309999900000000599999000"..., a_cpResponseStr=0x95ba588 "68287

amsWorker::run の 0x081344d5 (this=0x95b91d0)

workerThread::ThreadProc の 0x081cef83 (p=0x959f234)

/lib/tls/i686/libpthread.so.0 からの start_thread () の 0x003ca144

/lib/tls/i686/libc.so.6 からのクローン () の 0x00258a7e

4

3 に答える 3

5

私の推測では、マップのタイプが<char*, char*>であるため、それを読むと、ポインターポイント削除され、ポインターがワイルド ポインターになるコンテンツが作成されます。

map がinsertを行うとき、それは単にその値をコピーします。つまり、タイプがポインターの場合、ポインターの値はコピーされますが、ポインターが指すコンテンツはコピーされません。

type を に変更してみません<string, string>か? std::string は非常に低コストでコピーを処理し、ポインターによって引き起こされる問題を回避します。

于 2013-10-30T16:11:53.257 に答える
0

私は答えを得ました。あなたのすべてが正しいかもしれませんが、私のアプローチは異なります。私が予想したように、人々がそのようにしていた答えを知らないとき、私は反対票を投じました。

私の答えは、にiterator値を提供するときに使用していますmap key。そしてしばらくすると、 this から値が抽出されますiterator。値を取得すると、マップからいくつかの値を(無意識のうちに)削除していますが、それが私の問題です。ログを継続的に印刷した後、答えが得られました。

とにかく、あなたの反応と努力に感謝します。

于 2013-10-31T05:07:47.440 に答える