C ++从指针调用成员函数在引入参数时调用内存访问冲突

时间:2013-03-04 19:15:44

标签: c++ pointers member-function-pointers

我正在使用Winsock2编写服务器。收到的所有数据都是字符串形式。我有一个字符串解析器,它可以从字符串形式给出的方法签名中提取方法名称和参数。因此,AddNewMember(arg1,arg2)被拆分为一个名为signature的字符串,其中包含AddNewMember和一个包含arg1和arg2元素的字符串向量。这很好用。为了使这些消息有意义,我有一个成员函数指针的字符串映射,所有函数都采用相同的参数向量args。这是我的ServerControl类的地图:

//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”,参数是在()之间传递的paratmers的向量。

如果参数向量为空,这可以正常工作,但如果向量中添加一个参数,当代码到达此行并尝试调用成员函数时,我会收到内存访问冲突。我试过这个,参数是vector<string>*和普通的vector<string>。我很困惑。

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

1 个答案:

答案 0 :(得分: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); 
}