用ODBC读写EXCEL表格,当m_rSheet->Open(...
异常时,就发生泄漏,大家帮忙看看。这是为什么呢? CDatabase * pDatabase = new CDatabase;
pDatabase->OpenEx(m_sDsn, CDatabase::noOdbcDialog);
CRecordset * m_rSheet = new CRecordset(pDatabase);
// Open Sheet
CString sSql;
sSql.Format("SELECT * FROM [%s$A1:IV65536]", m_sSheetName);
try
{
m_rSheet->Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
}
catch(...)
{ pDatabase->Close();
delete m_rSheet;
m_rSheet = NULL;
delete pDatabase;
pDatabase = NULL;
}
异常时,就发生泄漏,大家帮忙看看。这是为什么呢? CDatabase * pDatabase = new CDatabase;
pDatabase->OpenEx(m_sDsn, CDatabase::noOdbcDialog);
CRecordset * m_rSheet = new CRecordset(pDatabase);
// Open Sheet
CString sSql;
sSql.Format("SELECT * FROM [%s$A1:IV65536]", m_sSheetName);
try
{
m_rSheet->Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
}
catch(...)
{ pDatabase->Close();
delete m_rSheet;
m_rSheet = NULL;
delete pDatabase;
pDatabase = NULL;
}
具体如下:
原本内存泄漏的地方,
m_rSheet->Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
如果打开失败(原因是查询语句sSql的错误),尽管catch中已经删除了所有new的东东,但还是有泄漏。现在改写成
TRY
{
......
}
CATCH(CDBException,e)
{
......
}
END_CATCH;
就不泄漏了(其他相同都相同)。
问题是解决了,但具体的原因没有搞清楚,心里郁闷。
如果有高人知道,还望不吝赐教。