C++构造函数相关的一点体会

来源:互联网 发布:java multithread 编辑:程序博客网 时间:2024/06/15 21:04

         今早在调试自己手头一个项目的时候,突然发现它不能正常工作了。现象非常奇怪。在这个项目中我使用了临界区来控制线程的同步,结果在进入临界区时出错。

        临界区的使用详解,请参考网上相关资料,或本人前面的一篇关于临界区的日志。该项目主要代码如下:

// DetectService.h
class CDetectService
{
public:
    CDetectService(LPCTSTR sPortName, IDetectServiceEvent
* pEvent);
public:
    
~CDetectService(void);
    
void Detect();
private:
    
void    StartDetect();
    
void    StopDetect();
}
;
//DetectService.cpp
CRITICAL_SECTION CriticalSection;

struct CriticalSecSyncObj 
{
    CriticalSecSyncObj()
    
{
        EnterCriticalSection(
&CriticalSection);
    }

    
~CriticalSecSyncObj()
    
{
        LeaveCriticalSection(
&CriticalSection);
    }

}
;

CDetectService::CDetectService(LPCTSTR sPortName, IDetectServiceEvent
* pEvent)
:m_sPortName(sPortName), m_pDSEvent(pEvent)
{    
                     
// ......
    InitializeCriticalSection(&CriticalSection);
    StartDetect();
}


CDetectService::
~CDetectService(void)
{
                      
// ......
    StopDetect();
    DeleteCriticalSection(
&CriticalSection);      // 开始少了这一句,后来添加了后还是出错
}


void CDetectService::StartDetect()
{
    CriticalSecSyncObj obj;
//! 进入临界区
    
//! 启动一个监测子线程
    AfxBeginThread(DetectThread, this);
}


void CDetectService::StopDetect()
{
    CriticalSecSyncObj obj;
//! 进入临界区
    if (m_bRunDetect)    //! 判断是否增在运行
    {
        
if (m_hExitDetect)    //! 判断是否触发退出
        {
            WaitForSingleObject(m_hExitDetect, INFINITE);
        }

    }

}

从代码来看,除了构造函数中曾经忘记释放临界区对象资源外,没有发现其他异常。

        后来我仔细看了看我调用该类的地方:

// SelectPortDlg.h
class CSelectPortDlg : public CDialog
{
public:
                     CSelectPortDlg(CWnd
* pParent = NULL);
private:
    CDetectService 
*m_detectService;
}


// SelectPortDlg.cpp
CSelectPortDlg::CSelectPortDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CSelectPortDlg::IDD, pParent)
{
    m_detectService 
= NULL;    // 开始没有这一句
}

发现如果没有m_detectService=NULL这一句的时候,会调用CDetectService的默认构造函数,而默认构造函数是编译器自动生成的,没有初始化临界区对象。于是进入临界区时,程序出错。刚开始,看到VS2005弹出一个异常提示窗口的时候,两眼就是一黑。觉得问题好像很难。不过,经过仔细分析和耐心调试后发现,其实问题的原因很简单。只是有关一些C++类的基本概念问题导致的。说到底,还是自己对C++的语法及工作机制还理解不深,导致这么一个异常产生。这也提醒我,需要不断的细细体会C++精神来更好的完成自己的目标。

原创粉丝点击