问一个stl::map的问题

logi001 2005-07-11 05:28:07
typedef map<CAskPacketKey, std::string, CAskLess> AskPackTable;
typedef pair<CAskPacketKey, std::string> P_AskPair;
AskPackTable m_mAskPacketTable;
======================以上为定义部分=============================
======================以下为出错代码=============================
char strPackCon[MAX_PATH*2] = {0};
...
string temp_con = strPackCon;
m_mAskPacketTable.insert( P_AskPair(newAskKey,temp_con) );//这句会错,为什么,怎么解决
...全文
488 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gandolf 2005-07-16
  • 打赏
  • 举报
回复
靠!老大,这么简单的东西也要这么多人跟贴?还没跟出个结论来?我晕一个先。 错误是在你allocate std::string 的 storage 在 stack 上,当你的std::string destruct的时候,你的char[]早就被destroy到姥姥家去了。大哥,以后拜托不要犯这种低级错误。
logi001 2005-07-16
  • 打赏
  • 举报
回复
以上两点是在高人提示之下的个人猜测,还没得出答案,
如有高人能看出错误请logi001@163.com告知,谢
logi001 2005-07-16
  • 打赏
  • 举报
回复
结贴.
对于这个问题,主要原因出现在~string();
目前没有解决方法,我也没找出原因,
有两总可能
1.因为m_mAskPacketTable.insert( P_AskPair(newAskKey,temp_con) )要插入
的内容比较大,有没有可能缓冲还没有写入,就过了string temp_con的生命域.
为此,在这句之后我使用了usleep,果然在此出现段错误的机会少了很多很多
2.可能因为其他误造作(我没查出来)改变了temp_con的相关值(因为他是一个类
对象),这种导致他在释放时没法析构.

以上两个为个人猜测,还没得出答案,如有高人能看出错误请logi001@163.com告知,
xlsue 2005-07-14
  • 打赏
  • 举报
回复
to hfjssss(阿shui):
当型别不一致时,型别会进行转换。因此,编译器必须支持member template!
xlsue 2005-07-13
  • 打赏
  • 举报
回复
我在怀疑,将一个char[]传给一个string,会不会有问题?
logi001 2005-07-13
  • 打赏
  • 举报
回复
写了.
char strPackCon[MAX_PATH*2] = {0};将数组置空
string temp_con = strPackCon;等于 string temp_con( strPackCon );
hfjssss 2005-07-13
  • 打赏
  • 举报
回复
说得明白一点就是你的P_AskPair不等于AskPackTable::value_type ;
hfjssss 2005-07-13
  • 打赏
  • 举报
回复
m_mAskPacketTable.insert( P_AskPair(newAskKey,temp_con) )
这样是有问题的:
原因很简单:
map里面是这样定义的:
typedef pair<const Key, T> value_type;
而你的typedef pair<CAskPacketKey, std::string> P_AskPair;类型不匹配。

应该定义为:typedef pair<const CAskPacketKey, std::string> P_AskPair;
这样就不会错了。
xlsue 2005-07-12
  • 打赏
  • 举报
回复
//检查你的CAskLess,它必须为仿函数
#include <iostream>
#include <string>
#include <map>
using namespace std;

class CAskPacketKey
{
public:
CAskPacketKey(char * s1, unsigned int pa, unsigned int ps, time_t t1)
{
strcpy(src_ip,s1);
pack_ack = pa;
pack_seq = ps;
time_begin = t1;
}

char src_ip[16];
unsigned int pack_ack;
unsigned int pack_seq;
time_t time_begin;
const CAskPacketKey& operator=( const CAskPacketKey& t )
{
strcpy(src_ip,t.src_ip);
pack_ack = t.pack_ack;
pack_seq = t.pack_seq;
time_begin = t.time_begin;
return *this;
}
protected:
private:
};


class CAskLess {
public:
bool operator() (const CAskPacketKey& c1, const CAskPacketKey& c2)
{
return c1.pack_ack < c2.pack_ack;
}
};

int main()
{
typedef map<CAskPacketKey, std::string, CAskLess> AskPackTable;
typedef pair<CAskPacketKey, std::string> P_AskPair;
AskPackTable m_mAskPacketTable;

char strPackCon[MAX_PATH*2] = {0};
string temp_con = strPackCon;
m_mAskPacketTable.insert( P_AskPair(CAskPacketKey("xlsue", 10, 10, 10),
temp_con) );

}
xlsue 2005-07-12
  • 打赏
  • 举报
回复
错了!把你的CAskLess贴出来!
xlsue 2005-07-12
  • 打赏
  • 举报
回复
你的<函数在哪里?写个<函数看看!
logi001 2005-07-12
  • 打赏
  • 举报
回复
我曾在m_mAskPacketTable.insert( P_AskPair(newAskKey,temp_con) );
之前用sprintf对temp_con和strPackCon进行了打印,两个是一样的.
我用的是redhat,使用g++..

在试.
sofdev 2005-07-12
  • 打赏
  • 举报
回复
还有就是strPackCon[MAX_PATH*2]这个字符串是保证以'\0'结尾的吗?
如果不是就用temp_con(strPackCon,MAX_PATH*2)来初始化
sofdev 2005-07-12
  • 打赏
  • 举报
回复
是不是与string的写时拷贝有关联?
你将string temp_con=strPackCon;
改成
string temp_con(strPackCon);
试试看呢?
如果不行的话,在temp_con(strPackCon);
后随便对temp_con进行一个写操作再试试看能不能解决
另外你用的是什么平台啊?
logi001 2005-07-12
  • 打赏
  • 举报
回复
没有啊..
class CAskPacketKey
{
public:
char src_ip[16];
unsigned int pack_ack;
unsigned int pack_seq;
time_t time_begin;
const CAskPacketKey& operator=( const CAskPacketKey& t )
{
strcpy(src_ip,t.src_ip);
pack_ack = t.pack_ack;
pack_seq = t.pack_seq;
time_begin = t.time_begin;
return *this;
}
protected:
private:
};
sofdev 2005-07-12
  • 打赏
  • 举报
回复
检查一下CAskPacketKey类是否使用了某些可能导致有冲突的变量,还有就是有没有拷贝构造函数
logi001 2005-07-12
  • 打赏
  • 举报
回复
xlsue(STL学习中。。。) :我的代码就是这此,其他的都没有任何关系
typedef map<CAskPacketKey, std::string, CAskLess> AskPackTable;
typedef pair<CAskPacketKey, std::string> P_AskPair;
AskPackTable m_mAskPacketTable;
======================以上为定义部分=============================
======================以下为出错代码=============================
char strPackCon[MAX_PATH*2] = {0};
...//这里是给strPackon赋值,使用memcpy.
string temp_con = strPackCon;
m_mAskPacketTable.insert( P_AskPair(newAskKey,temp_con) );//这句会错,为什么,怎么解决
xlsue 2005-07-12
  • 打赏
  • 举报
回复
STL的错误信息看不懂!太多!
1。贴代码出来
2。换编译器试试
3。sftk(星海传说)的代码就没问题,你试编译看看,看是否是你的编译器问题。
logi001 2005-07-12
  • 打赏
  • 举报
回复
如果将m_mAskPacketTable.insert( P_AskPair(newAskKey,temp_con) );改成为
m_mAskPacketTable.insert( P_AskPair(newAskKey,"这里为一个字符串") );
就不会出现类似情况,是不是应该主要留意以下两句:
#5 0x0805143d in ~pair (this=0x805c1e0) at PacketDeal.cpp:177
#6 0x080508ad in _Destroy<std::pair<const CAskPacketKey, std::string> > (__pointer=0x805c1e0) at stl_construct.h:125

求救啊...
logi001 2005-07-12
  • 打赏
  • 举报
回复
以上各位大侠的方法都试过了,没能解决.
用gdb调试,请看错误所在
(gdb) where
#0 0x420744ed in _int_free () from /lib/tls/libc.so.6
#1 0x420734d6 in free () from /lib/tls/libc.so.6
#2 0x400d3983 in operator delete(void*) () from /usr/lib/libstdc++.so.5
#3 0x400c732e in std::string::_Rep::_M_destroy(std::allocator<char> const&) () from /usr/lib/libstdc++.so.5
#4 0x400c4511 in std::string::~string() () from /usr/lib/libstdc++.so.5
#5 0x0805143d in ~pair (this=0x805c1e0) at PacketDeal.cpp:177
#6 0x080508ad in _Destroy<std::pair<const CAskPacketKey, std::string> > (__pointer=0x805c1e0) at stl_construct.h:125
#7 0x08050675 in std::_Rb_tree<CAskPacketKey, std::pair<CAskPacketKey const, std::string>, std::_Select1st<std::pair<CAskPacketKey const, std::string> >, CAskLess, std::allocator<std::pair<CAskPacketKey const, std::string> > >::destroy_node(std::_Rb_tree_node<std::pair<CAskPacketKey const, std::string> >*) (this=0x805bb3d, __p=0x805c1d0) at stl_tree.h:640
#8 0x0804fe8d in std::_Rb_tree<CAskPacketKey, std::pair<CAskPacketKey const, std::string>, std::_Select1st<std::pair<CAskPacketKey const, std::string> >, CAskLess, std::allocator<std::pair<CAskPacketKey const, std::string> > >::erase(std::_Rb_tree_iterator<std::pair<CAskPacketKey const, std::string>, std::pair<CAskPacketKey const, std::string>&, std::pair<CAskPacketKey const, std::string>*>) (this=0x805bb3d, __position={<_Rb_tree_base_iterator> = {_M_node = 0x0}, <No data fields>})
at stl_tree.h:1174
#9 0x0804f7b5 in std::map<CAskPacketKey, std::string, CAskLess, std::allocator<std::pair<CAskPacketKey const, std::string> > >::erase(std::_Rb_tree_iterator<std::pair<CAskPacketKey const, std::string>, std::pair<CAskPacketKey const, std::string>&, std::pair<CAskPacketKey const, std::string>*>) (this=0x805bb3d, __position=
{<_Rb_tree_base_iterator> = {_M_node = 0x37303331}, <No data fields>}) at stl_map.h:284
#10 0x0804dc2f in CDealPacket::DealPacketData(unsigned char*, unsigned) (this=0xbffff520, pData=0x42c70714 "", uDadaLen=200)
at PacketDeal.cpp:359
#11 0x0804f501 in CDealPacket::PacketDeal_Thread(void*) (pParam=0xbffff520) at PacketDeal.cpp:1139
#12 0x400402b6 in start_thread () from /lib/tls/libpthread.so.0
加载更多回复(16)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧