我用BoundsCheck检查内存泄漏,它指出下面这句内存泄漏:
1、m_pRegDB = new CDatabase(); //Memory leak2、new CDynLinkLibrary(MouseHookDLL);
我看MSDN上也就是这样做的。怎么就内存泄漏了呢??
1、m_pRegDB = new CDatabase(); //Memory leak2、new CDynLinkLibrary(MouseHookDLL);
我看MSDN上也就是这样做的。怎么就内存泄漏了呢??
{
delete m_pRegDB;
m_pRegDB = NULL;
}
new和malloc申请的内存都是从堆上分配的,所以都需要释放所谓new出来不用释放的一般都是在哪些有垃圾收集机制的语言中,例如java就可以只管new而不用担心内存泄漏。
C/C++中还是都需要手动释放的,也有一些特殊的数据结构可以做到自动释放,例如智能指针等,基本原理都是构造函数申请内存,析构函数释放内存不管怎么说delete和free语句还是要写的
void ASRegDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
if (m_pRegRst != NULL)
{
if (m_pRegRst->IsOpen())
m_pRegRst->Close();
delete m_pRegRst;
m_pRegRst = NULL;
}
if (m_pRegDB != NULL)
{
m_pRegDB->Close();
delete m_pRegDB;
m_pRegDB = NULL;
}
CDialog::OnClose();
}为什么还会这样呢??
或你是否只new一次?
2。保证new出的东西内部没用leak.
3。不要过于相信工具,包括BoundsCheck。
m_pRegDB = new CDatabase();
m_pRegRst = new CRecordset(m_pRegDB);在OnClose()中释放。应该没问题呀!
我是程序出错后,才想到用这个试试。to wenkui(我心飞翔)
看看走你的delete了吗?或你是否只new一次?
------------------------
1、 什么意思?它是在执行Open语句时抛错被Catch后执行了下面语句。
catch (CDBException* pEx)
{
pEx->Delete();
return;
}
你是说的这个吗?
2、我只在OnInitDialog()中New了一次。
1、释放new出的东西。
2、保证new出的东西内部没用leak.
--------------
这两个不是一个意思吗?不懂。能多说两句吗?
好像没有了,但是其他的对话框中的释放操作都是放在OnClose()里,好好的。也没发生泄漏呀!
为什么呢??
我在OnDestroy()中释放结果集,没有内存泄漏,但是程序本身的执行有问题。
用BoundsCheck检查,发现它抛错。
EXCEPTION(2nd Chance) Exception: Access Violation
code: C0000005 addr:023667E6
ODBC32.dll-000067E6 (02360000)
invalid read from DDDDDDDD
EAX:02390000 EBX:02390000 ECX:DDDDDDDD
EDX:0012F690 ESI:DDDDDDDD EDI:0012F718
ESP:0012F664 EBP:0012F6A8 EIP:023667E6
EFLAGS:00010286
CS:001B DS:0023 ES:0023
SS:0023 FS:003B GS:0000
Stack dump
00143C60:00000000:0C07BD90:DDDDDDDD
Call stack
ODBC32.dll!000067E6
!0000A569
是否表示对数据库的操作有问题?
可能是什么错呢?
if (m_pGroupRst->IsOpen()) //抛错
m_pGroupRst->Close();晕~~
if (m_pGroupRst != NULL)
{
if (m_pGroupRst->IsOpen())
m_pGroupRst->Close();
delete m_pGroupRst;
m_pGroupRst = NULL;
}
“×××”指令应用了“0Xdddddddd”内存。该内存不能为“Read”。
class A {
A() { m_p = new int ; }
virtual ~A() { delete m_p ; }
public:
int *m_p ;
} ;A *pA = new A ;
那在delete之前要调destroywindow();
有其它windows资源
new 出来的在delete前要调destorywindow();