CAsyncSocket如果我CAsyncSocket在调用之后Connect但在OnConnect调用回调之前删除了应用程序,则会崩溃我的应用程序. ASSERT(pSocket != NULL)失败CAsyncSocket::DoCallBack并且应用程序退出.
换句话说,如果我创建一个CAsyncSocket,尝试将其连接到服务器,然后在该连接成功或失败之前将其终止,我就会遇到问题.我可以通过实现OnConnect和设置一个标志来避免这种特殊的崩溃,该标志指示连接尝试已完成.如果标志为false,我知道删除是不安全的.
在删除对象之前是否还需要检查其他情况?有没有一种方法来检查它是否安全?或者我需要实现我可能会启动任何操作所有的回调(OnReceive,OnSend,OnConnect),并确保这些回调已经叫什么名字?
我被要求为朋友查看一些代码.(由于MFC和许多糟糕的代码,我正确地犹豫了,但他赢了......)
这是一个基于对话框的应用程序,它使用了一个CAsyncSocket.
问题表现在一些不间断的debugbreaks和其他类似的事情 - MFC ENSURE()宏也有问题- 检查套接字是否为null.所有问题都发生在MFC的深处.
如果使用Vista/XP中的主题,一些谷歌搜索显示可能的资源泄漏,但我不认为这是问题.
基于我几个小时的调试,代码非常差,但基本上它正在执行以下操作:
(建立连接时没有问题 - 只有在没有连接时才会出现这种情况)
CAsyncSocket对象上)OnConnect()我们被通知连接不起作用/没有连接.OnConnect()不好)那么我们打电话CAsyncSocket::Close(),然后打电话CAsyncSocket::Create()(没有参数)然后打电话CAsyncSocket::Connect(server, port) 请注意,初始调用Connect()没有先前的调用Create().
Create()需要?(如果我删除它然后它不再崩溃,但我重新建立连接时也不连接)我固定的代码,这样,所有的路径经过呼吁Create()然后Connect().
我仍然遇到断言问题CAsyncSocket::DoCallBack()- 下面代码的最后一行是断言:
void PASCAL CAsyncSocket::DoCallBack(WPARAM wParam, LPARAM lParam)
{
if (wParam == 0 && lParam == 0)
return;
// Has the socket be closed - lookup in dead …Run Code Online (Sandbox Code Playgroud)