2013-03-04 14 views
1

我正在使用Winsock2编写服务器。所有收到的数据都是字符串形式。我有一个字符串解析器,它可以从字符串形式中提取方法名称和方法签名中的参数。因此,AddNewMember(arg1,arg2)被分割成一个名为signature的字符串,其中包含AddNewMember和一个包含arg1和arg2的字符串向量。这工作正常。为了使这些消息有意义,我有一个字符串映射到成员函数指针,所有函数都采用相同的参数向量args。这里是我的地图从我ServerControl类:从指针调用成员函数的C++在引入参数时调用内存访问冲突

//from header 
map<string, string (ServerControl::*)(vector<string>)> functionMap; 

//this on init creates all entries to function map 
functionMap["AddNewMember"] = &ServerControl::AddNewMemberFunc; 
functionMap["GetMember"] = &ServerControl::GetMemberFunc; 
functionMap["RemoveMember"] = &ServerControl::RemoveMemberFunc; 

...etc 

那么一旦传入的消息已经被解析成其部分下面的代码访问地图,让成员函数指针。

if (functionMap.find(signature) != functionMap.end()) 
{ 
    return (this->*functionMap[message])(arguments); 
} 

再一次签名部分是“AddNewMethod”,参数是在()之间传入的辅助符的向量。

如果参数向量为空,但是如果即使一次将参数添加到向量中,当代码到达此行并尝试调用成员函数时,它也会按预期工作,从而导致内存访问冲突。我试过这个,参数是vector<string>*以及一个普通的vector<string>。我很困惑。

我只真的开始在这个项目上使用函数指针,所以我不亲。任何帮助将不胜感激!谢谢

回答

1

您正在使用signature搜索地图,但使用message从地图中检索成员指针。如果signaturemessage不是相同的值,那么您将不会得到您期望的指针,如果message值在地图中不存在,那么甚至可能是NULL指针。检索指针时需要再次使用signature。更好的是,由于您已经执行了一次搜索,因此您应该使用搜索结果而不是调用[]运算符来再次执行相同的搜索。

试试这个:

typedef string (ServerControl::*VectorArgMember)(vector<string>); 
map<string, VectorArgMember> functionMap; 

map<string, VectorArgMember>::iterator i = functionMap.find(signature); 
if (i != functionMap.end()) 
{ 
    VectorArgMember memberPtr = i->second; 
    return (this->*memberPtr)(arguments); 
} 
+0

哇。这样一个简单的错误。我已经工作了10个小时,我很累,所以需要额外的一双眼睛。谢谢一堆 – 2013-03-04 19:36:40