1

我创建了一个多图ErrorMap并插入这样的值

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

在此之后,我正在阅读此地图三遍以处理一些请求。在删除之前,我打印地图,前两个对值已损坏,其余值正常。

我在这里得到核心转储。

我可以详细了解这些值在阅读时是如何影响的吗?任何解决方案,以便我可以保存我的地图,直到我明确删除它。

我的日志

mapItrMov4.first (€J+) mapItrMov4.second(无效的服务请求)

mapItrMov4.first (hK+) mapItrMov4.second(无效的服务请求)

mapItrMov4.first (first) mapItrMov4.second (InvalidServiceRequest)

……

之后就好了

gdb 回溯

(gdb) BT

0x001c2cae in raise () from /lib/tls/i686/libc.so.6

0x001c42b0 in abort () from /lib/tls/i686/libc.so.6

来自 /lib/tls/i686/libc.so.6 的 __libc_message () 中的 0x001f2469

0x001f7ef8 in _int_free () from /lib/tls/i686/libc.so.6

/lib/tls/i686/libc.so.6 中的 free() 中的 0x001f824f

0x004dbfd1 in operator delete () from /usr/lib/libstdc++.so.6

来自 /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>102000073589953099999000000000599999000"..., 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插入时,它只是复制它的 value。这意味着:如果类型是指针,它会复制指针的值不是它指向的内容。

为什么不将类型更改为<string, string>?std::string 以非常低的成本处理复制,避免了指针引起的问题。

于 2013-10-30T16:11:53.257 回答
2

因此,我将假设ErrorMapis的类型map<char*, char*>,因为您使用该类型value_type进行插入。

在你写作的那一刻,map<char*你就已经迷失了。您会遇到内存管理问题,此外您没有得到正确的排序,因为它将按指针值而不是字符串值排序。而且它不是 const 安全的,因为它不会阻止您修改键指向的内容,这是破坏地图的另一种绝妙方法。

只需使用 amap<string, string>即可摆脱一大堆头痛。

于 2013-10-30T16:13:22.553 回答
0

我得到了我的答案。可能你们都是对的,但我的方法不同。正如我所料,当人们不知道他们过去那样做的答案时,我会投票失败。

我的答案是我在iteratormap key. 一段时间后,我从中提取了值iterator。当我得到值时,我正在从地图中删除一些值(在不知不觉中),这就是我的问题。连续打印日志后,我得到了答案。

无论如何感谢您的回应和努力。

于 2013-10-31T05:07:47.440 回答