作者在 2011-02-02 19:31:10 发布以下内容
前几天遇到了传说中的R6025错误,经过网络上搜索一番知道这是由于运行时调用了鸡肋的纯虚函数,一般出现在构造函数和析构函数中间接的调用了纯虚函数。但问题是,这不是我的情况。因此,我进行了两天的代码调试,总算是发现了元凶。
问题出在完成端口!在我的完成端口模型中,完成键是一个对象,它随一个SOCKET句柄关联到完成端口。当一个完成包被成功获取,则使用这个完成键(对象)执行完成任务。这没错,并且我把对象使用引用计数来管理生命周期,一切尚在预期之中。但问题出在,我需要更换这个SOCKET句柄的完成键。当这个SOCKET需要收发数据,则被封装在一个叫NetSession的类中,完成键就是这个NetSession,收发的处理就由NetSession来完成。而当这个SOCKET需要重用时,就需要另外一个对象来处理,因此在调用DisconnectEx之前,我必须改变完成键,使之能处理DisconnectEx的完成包。在此之前,我已经释放了NetSession对象(引用计数已经为0),但SOCKET被保留待重用。我对这个SOCKET进行了重新关联完成端口,并使用了能处理DisconnectEx的对象为完成键。这就悲剧所在,我在重新关联完成端口时得到了87错误!而我则选择了忽略了它!结果这个SOCKET调用了DisconnectEx,而在处理完成包的则是那个已经释放的NetSession!!R6025!!
解决这个问题,目前只有两个想法(不是方法):
1、找到能够重新关联完成端口的方法。
2、重叠结构是一个突破口。
希望在下一年伊始能够解决问题。。。