导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

内存泄漏的问题!!

angelcool 2005-05-25 10:53:01
我用BoundsCheck检查内存泄漏,它指出下面这句内存泄漏:
1、m_pRegDB = new CDatabase(); //Memory leak

2、new CDynLinkLibrary(MouseHookDLL);
我看MSDN上也就是这样做的。怎么就内存泄漏了呢??
...全文
124 点赞 收藏 22
写回复
22 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
angelcool 2005-05-25
很奇怪!
我在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
是否表示对数据库的操作有问题?
可能是什么错呢?
回复
angelcool 2005-05-25
to lvgame(gameboy)
好像没有了,但是其他的对话框中的释放操作都是放在OnClose()里,好好的。也没发生泄漏呀!
为什么呢??
回复
angelcool 2005-05-25
to QunKangLi(维护成本与程序员的创造力的平方成正比)
1、释放new出的东西。
2、保证new出的东西内部没用leak.
--------------
这两个不是一个意思吗?不懂。能多说两句吗?
回复
lvgame 2005-05-25
放到OnDestroy中试试。
回复
angelcool 2005-05-25
to QunKangLi(维护成本与程序员的创造力的平方成正比)
我是程序出错后,才想到用这个试试。

to wenkui(我心飞翔)
看看走你的delete了吗?或你是否只new一次?
------------------------
1、 什么意思?它是在执行Open语句时抛错被Catch后执行了下面语句。
catch (CDBException* pEx)
{
pEx->Delete();
return;
}
你是说的这个吗?
2、我只在OnInitDialog()中New了一次。

回复
angelcool 2005-05-25
我在OnInitDialog中
m_pRegDB = new CDatabase();
m_pRegRst = new CRecordset(m_pRegDB);

在OnClose()中释放。应该没问题呀!
回复
QunKangLi 2005-05-25
1。释放new出的东西。
2。保证new出的东西内部没用leak.
3。不要过于相信工具,包括BoundsCheck。
回复
laogong165 2005-05-25
gz~~~
回复
wenkui 2005-05-25
断点断一下 看看走你的delete了吗?
或你是否只new一次?
回复
angelcool 2005-05-25
我在对话框关闭时释放内存了。
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();
}

为什么还会这样呢??
回复
BoundsCheck检查比较严格,第一个问题你要修改,第二个是MFC的逻辑,MFC程序结束后这个内存会被系统回收(和其他内存泄漏一样,但是只发生一次)
回复
jingyad 2005-05-25

new和malloc申请的内存都是从堆上分配的,所以都需要释放

所谓new出来不用释放的一般都是在哪些有垃圾收集机制的语言中,例如java就可以只管new而不用担心内存泄漏。
C/C++中还是都需要手动释放的,也有一些特殊的数据结构可以做到自动释放,例如智能指针等,基本原理都是构造函数申请内存,析构函数释放内存

不管怎么说delete和free语句还是要写的
回复
bohut 2005-05-25
在结束调用的地方你需要delete指针来释放内存,否则就造成内存泄漏

if(m_pRegDB)
{
delete m_pRegDB;
m_pRegDB = NULL;
}
回复
wenkui 2005-05-25
对了 你是对话框
有其它windows资源
new 出来的在delete前要调destorywindow();
回复
QunKangLi 2005-05-25
另:程序运行时出的是什么错?

像这种只new了一回的情况,即使不delete也对程序运行没得影响。
回复
wenkui 2005-05-25
对了 你是个对话框?
那在delete之前要调destroywindow();
回复
QunKangLi 2005-05-25
2。保证new出的东西内部没有leak.

有些类会在使用中new些东西出来,如下面这个类:
class A {
A() { m_p = new int ; }
virtual ~A() { delete m_p ; }
public:
int *m_p ;
} ;

A *pA = new A ;
回复
angelcool 2005-05-25
抛的错是:
“×××”指令应用了“0Xdddddddd”内存。该内存不能为“Read”。
回复
angelcool 2005-05-25
我有判断的:
if (m_pGroupRst != NULL)
{
if (m_pGroupRst->IsOpen())
m_pGroupRst->Close();
delete m_pGroupRst;
m_pGroupRst = NULL;
}
回复
wenkui 2005-05-25
用这个指针m_pGroupRst前 一定判是不是NULL
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……