MFC工程
条件1:在约定时间内没收到服务器的信号 便断开连接、释放资源。
条件2:用户点击关闭按钮主动关闭客户端时断开连接、释放资源。
条件3:资源比较多,释放时需要花一定的时间。
问题描述: 在用户点击关闭按钮时 程序运行到
if( NULL != p )
{
  delete p;
  Sleep(5000);  <-// 为了让问题更明显
  p = NULL;
}
刚好就在删掉p时, 记时器也到了,同样执行
if( NULL != p ) <- //pass
{
  delete p;     <- //又一次delete 
  Sleep(5000);  <-// 为了让问题更明显
  p = NULL;
}
试着用CRITICAL_SECTION 保护if语句,发现在单线程中EnterCriticalSection()不起作用。
麻烦各位大侠帮忙解决一下这类问题。谢谢!!!

解决方案 »

  1.   

    删除在一个地方执行!定时器里面不要直接删除,直接发个消息,由消息响应来执行删除!
    另外,没有必要sleep吧
      

  2.   

    谢谢1楼,Sleep我只是夸张了点。
    我现在是两个dll,两边调用的是同一个释放函数。
    资源释放在dll_1中完成,记时器响应在dll_1中(我也是到时间去发送的消息 响应资源释放函数),。
    而关闭响应是在EXE_2中,EXE_2的关闭响应函数去调用dll_1中的资源释放函数。
    我不能确定会不会因为两上库造成了消息队列对消息管理不是线性处理?
      

  3.   

    典型的循环删除,使用如下代码:if( NULL != p )
    {
      temp = p;
      p = NULL;
      delete temp
    }
    c++里面需要强数据一致性保证,在C++设计书里面会提到类似的错误及解决办法。