为什么MSComm控件一旦打开串口失败,关闭程序时总有内存泄漏。如何解决

为什么MSComm控件一旦打开串口失败,关闭程序时总有内存泄漏。怎么解决?
串口在已被占用,或者不存在的情况下,进入Catch里。我曾在Catch里做过很多尝试,关闭程序时(做了关闭串口和释放串口对象的动作的)还是要泄漏内存。
CFireProtection是MSComm的派生类。CFireProtection的对象是以指针形式创建的。
代码如下:

m_pFireProtection = new CFireProtection();
m_pFireProtection->Create(NULL,WS_CHILD,CRect(0,0,0,0),this,IDC_MSCOMM_FIRE,NULL,false,CMSComm::bstrLicense);
m_pFireProtection->SetPort(1);
m_pFireProtection->SetBaudrate(9600);
m_pFireProtection->SetDatabits(8);
m_pFireProtection->SetStopbits(1);
m_pFireProtection->SetParity('N');
m_pFireProtection->InitComm();



void CFireProtection::InitComm(void)
{
CString   str;
put_InputMode(1);
put_RThreshold(1);
put_OutBufferSize(1024);//
put_InputLen(0);
put_InBufferSize(1024);
str.Format(_T("%d,%C,%d,%d"),m_nbaudrate,m_cParity,m_databits,m_stopbits);
put_Settings(str);
BOOL bol = get_PortOpen();
if(!bol)
{
try
{
put_PortOpen(TRUE);
}
catch(...)
{
return;
}
}
    str =get_Input();
}
//程序关闭时的清理动作:

void CDataAgentDlg::OnDestroy()
{
m_pFireProtection->CloseComm();
CDialog::OnDestroy();
delete m_pFireProtection;


------解决方案--------------------
catch(...) 

return; 

在这里delete可以吗。

另外,退出时delete   m_pFireProtection; 不太安全,需要先
if (m_pFireProtection)

程序初始时先 m_pFireProtection = NULL;
------解决方案--------------------
不过串口最好不要用MSComm这个东西,直接CreateFile就行了,可以google一下CSerialPort,封装的很不错,很多年前就在用。