UINT Server::loginAndRegHandlerThread(void *pParam) //处理客户端登录和注册请求线程函数(静态),由主线程创建
{
... ... while(pServer->running)
{
CmdPackage recvCmd;        //CmdPackage是一个继承于Package的派生类
int nRecv = recv(conSock, (char*)&recvCmd, sizeof(CmdPackage), 0); //接收数据包
if(nRecv > 0)
{
if(pServer->parsePackage(recvCmd))     //调用Server类的parsePackage函数
{
                               ... ...
                         }
                }
                ... ...
         } return 0;
}bool Server::parsePackage(Package &package) const      //Package是基类(抽象类)
{
Package::PROTOCOL protocol = package.getProtocol();
switch(protocol)
{
       ... ...
case Package::LOGIN:
{
string userID, userPass;
package.parseLOGIN(userID, userPass);   //parseLOGIN是Package类的纯虚函数,CmdPackage类中已重写。运行到这里出错!
return validateUser(userID);
}
       ... ...
}
}bool CmdPackage::parseLOGIN(string &id, string &pass) const
{
      ... ...
}我的想法是当接收到一个命令数据包(CmdPackage)之后,调用parsePackage(Package &package)函数,通过将子类对象传递给父类引用实现多态,即实际调用的parseLOGIN函数应该为CmdPackage::parseLOGIN()。
但是运行到package.parseLOGIN(userID, userPass);时报错:
Server.exe 中的 0x00d055ff 处未处理的异常: 0xC0000005: 读取位置 0x013ecc44 时发生访问冲突
接收到的数据包是正确的。

解决方案 »

  1.   

    我并没有实例化Package类,函数bool Server::parsePackage(Package &package) const中的参数package为引用。
      

  2.   

    没有。个人感觉还是socket直接发送和接收类对象导致的问题,虽然类中没有指针类型数据,但在需要使用虚函数的情况下包含虚函数表指针,在发送和接收的过程中进行的内存拷贝导致虚函数表指针出错。
      

  3.   


     CmdPackage 
     Package 检察内部变量。