为什么delete cdatabase会发生错误呢
为什么delete cdatabase会发生异常呢?
如上面代码,delete Base.pDatabase;这里异常.
连接未打开
State:08003,Native:0,Origin:[Microsoft][ODBC 驱动程序管理器]
堆栈信息是这样:
CDatabase::Close() line 378 + 17 bytes
CDatabase::Free() line 417
CDatabase::~CDatabase() line 222
CDatabase::`vector deleting destructor'(unsigned int 1) + 81 bytes
CSearchSql::AddDataBaseThread(void * 0x0013fc1c) line 688 + 54 bytes
_AfxThreadEntry(void * 0x0013f420) line 112 + 13 bytes
_threadstartex(void * 0x00bdb170) line 212 + 13 bytes
KERNEL32! 7c80b713()
具体是CDataBase类Close()里面这样一段代码引发的异常:
我的CDataBase是自己申请的内存.那么这里应该怎样释放内存呢??
------解决方案--------------------
try里面的代码存在异常!
------解决方案--------------------
看有没有Dispose这个函数,如果没有就直接赋值NULL试试看有没有内存泄露
Base.pDatabase=new CDatabase;//这里申请的内存
...//一些其他的代码
try
{
TRACE1("\n%s",ConnStr);
int ret = Base.pDatabase->OpenEx(ConnStr,CDatabase::noOdbcDialog);//判断连接
((CSearchSql*)Ptr)->m_pTmpConnect=NULL;
TRACE1("\npDatabase->OpenEx return value=%d",ret);
}
catch(...)
{
((CSearchSql*)Ptr)->m_bThreadState=THREADEXIT;
((CSearchSql*)Ptr)->m_Err=_T("OpenEx exception.");
delete Base.pDatabase;//Exception
//First-chance exception in ScriptTool.exe (ODBC32.DLL): 0xC0000005: Access Violation.First-chance exception in ScriptTool.exe (ODBC32.DLL): 0xC0000005: Access Violation.
((CSearchSql*)Ptr)->m_pTmpConnect=NULL;
return -1;
}
如上面代码,delete Base.pDatabase;这里异常.
连接未打开
State:08003,Native:0,Origin:[Microsoft][ODBC 驱动程序管理器]
堆栈信息是这样:
CDatabase::Close() line 378 + 17 bytes
CDatabase::Free() line 417
CDatabase::~CDatabase() line 222
CDatabase::`vector deleting destructor'(unsigned int 1) + 81 bytes
CSearchSql::AddDataBaseThread(void * 0x0013fc1c) line 688 + 54 bytes
_AfxThreadEntry(void * 0x0013f420) line 112 + 13 bytes
_threadstartex(void * 0x00bdb170) line 212 + 13 bytes
KERNEL32! 7c80b713()
具体是CDataBase类Close()里面这样一段代码引发的异常:
TRY
{
while (!m_listRecordsets.IsEmpty())
{
CRecordset* pSet = (CRecordset*)m_listRecordsets.GetHead();
pSet->Close(); // will implicitly remove from list
pSet->m_pDatabase = NULL;
}
}
CATCH_ALL(e)
{
AfxUnlockGlobals(CRIT_ODBC);
THROW_LAST();
}
END_CATCH_ALL
我的CDataBase是自己申请的内存.那么这里应该怎样释放内存呢??
------解决方案--------------------
try里面的代码存在异常!
------解决方案--------------------
看有没有Dispose这个函数,如果没有就直接赋值NULL试试看有没有内存泄露