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

在调试项目时遇到线程同步问题,发现是由于在类的构造函数中未正确初始化临界区对象,导致进入临界区时出错。原本误以为是复杂问题,其实是C++类的构造函数和编译器自动生成的默认构造函数理解不足。通过深入分析,了解到类构造函数的重要性,并强调了对C++语法和机制深入理解的必要性。
摘要由CSDN通过智能技术生成

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

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

//  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++精神来更好的完成自己的目标。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值