我创建了一个multimapErrorMap并插入如下值

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(invalidServiceQuest)
……
之后就没事了
GDB回溯
(gdb)英国电信
0x001c2cae in raise()来自/lib/tls/i686/libc.so.6
0x001C42B0 in abort()来自/lib/tls/i686/libc.so.6
0x001f2469在/lib/tls/i686/libc.so.6中的libc消息()中
0x001f7ef8位于/lib/tls/i686/libc.so.6中的@int_free()中
0x001f824f in free()来自/lib/tls/i686/libc.so.6
0x004dbfd1 in operator delete()从/usr/lib/libstdc++.so.6删除
0x004dc01d in operator delete[](从/usr/lib/libstdc++.so.6中删除)
amsaccmgmtreqhandler::opservicesreqhandler中的0x080ab607(此=0x95b91dc,
M U响应=0x95BA588“68287
amsaccmgmtreqhandler::handlerequest中的0x080b35c4(这个=0x95b91dc,
a_cprequeststr=0x2187820“1个<
MSISDN>1020000735895309999990000059999900“…,
A_cpresponsest=0x95BA588“68287
amsworker::run中的0x081344d5(this=0x95b91d0)
workerThread::threadproc中的0x081Cef83(p=0x959f234)
0x003CA144位于/lib/tls/i686/libpthread.so.0中的start_thread()中
0x00258A7E,克隆自/lib/tls/i686/libc.so.6

最佳答案

我的猜测是,因为地图的类型是<char*, char*>,所以当你阅读地图时,指针点所在的内容被删除,并使指针变为野生指针。
当map确实插入时,它只是复制它的值。这意味着:如果type是pointer,它复制的是pointer的值,而不是它所指向的内容。
为什么不把类型改成<string, string>?string以非常低的成本处理复制,并避免指针引起的问题。

关于c++ - C++ map 值损坏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19687660/

10-13 07:20
查看更多