内存泄露,大家帮帮我啊

AndonVC 2007-06-15 01:26:08
泄露在BaseDbProxy.cpp中,只有一个new,哭死了

D:\Test\AndonDB\BaseDbProxy.cpp(26) : {80} normal block at 0x00374EF0, 12 bytes long.
Data: < } > E4 7D 04 10 01 00 00 00 E8 0E C7 00
Object dump complete.
The thread 0xD8C has exited with code 2 (0x2).

大家帮帮我啊:

BaseDbProxy.h中的代码------------------------------------------------

#ifndef AFX_BaseDbProxy_H__
#define AFX_BaseDbProxy_H__

#include "LCDbConnection.h"

#define DBFIELD(name) \
res->GetFields()->GetItem(name)->GetValue()

#define DBFIELD1(res, name) \
res->GetFields()->GetItem(name)->GetValue()

#define STRFIELD(name) \
(LPCTSTR)(_bstr_t)DBFIELD(name)

#define STRFIELD1(res, name) \
(LPCTSTR)(_bstr_t)DBFIELD1(res, name)

class AFX_EXT_CLASS CBaseDbProxy
{
public:
//连接数据库
static BOOL Connect();
//关闭数据库
static BOOL Close();
//得到连接对象
static CLCDbConnection * GetConnection();
static ADODB::ADO_LONGPTR GetStrLen(LPCTSTR lpsz)
{
LONG len = 0;
if ( NULL != lpsz)
len = (LONG)_tcslen(lpsz);

#ifdef _UNICODE
len *= 2;
#endif
if (len < 1 )
len = 1; //如果是空字符串确保有结束符

return len;
}

protected:
static CLCDbConnection * m_pDbCon;
static BOOL m_bConnected;
};

#endif



BaseDbProxy.cpp中的代码------------------------------------------------
#include "StdAfx.h"
#include "BaseDbProxy.h"
#include "IniFile.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CLCDbConnection * CBaseDbProxy::m_pDbCon = NULL;
//在同一进程内只有一个连接
BOOL CBaseDbProxy::m_bConnected = FALSE;


CLCDbConnection * CBaseDbProxy::GetConnection()
{
return m_pDbCon;
}

BOOL CBaseDbProxy::Connect()
{
if ( m_bConnected ) //已经连接
return TRUE;
if(m_pDbCon==NULL)
m_pDbCon=new CLCDbConnection();
if ( ! m_pDbCon->IsConnected() )
{
CIniFile Ini;
if ( ! Ini.SetPath(Ini.GetAppPath()+"//dfs.ini"))
{
AfxMessageBox(_T("未找到dfs.ini文件"));
return FALSE;
}

_bstr_t bstrConn = Ini.GetKeyValue("Database", "ConnStr");
//bstrConn += _bstr_t("UID=DFSUSER; PWD=1234;");
if ( ! m_pDbCon->Connect(bstrConn) )
return FALSE;
m_bConnected = TRUE;
}


return TRUE;
}

//关闭数据库连接
BOOL CBaseDbProxy::Close()
{
if ( m_bConnected )
{
if ( m_pDbCon != NULL )
{
if ( m_pDbCon->IsConnected() )
{
BOOL bResult = m_pDbCon->Disconnect();
m_pDbCon->Release();
m_pDbCon = NULL;
return bResult;
}
}
}
return FALSE;
}
...全文
208 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
居易锦风 2007-06-15
  • 打赏
  • 举报
回复
BOOL CBaseDbProxy::Close()
{
if ( m_bConnected )
{
if ( m_pDbCon != NULL )
{
if ( m_pDbCon->IsConnected() )
{
BOOL bResult = m_pDbCon->Disconnect();
m_pDbCon->Release();
delete m_pDbCom;
m_pDbCon = NULL;
return bResult;
}
}
}
return FALSE
...
加上delete m_pDbCom;
AndonVC 2007-06-15
  • 打赏
  • 举报
回复
改不出来,哭啊...
怎么办啊
zdleek 2007-06-15
  • 打赏
  • 举报
回复
没有仔细看楼主的代码
如果你确认delete被正确地调用了
你就可以不必理会那个泄露警告,那个不是100%的准确
AndonVC 2007-06-15
  • 打赏
  • 举报
回复
能说清楚一点吗
zhangyq73 2007-06-15
  • 打赏
  • 举报
回复
m_pDbCon->Release()中并没有delete. new和delete一定要配对,在析构函数中直接delete,不用判断.
AndonVC 2007-06-15
  • 打赏
  • 举报
回复
析构函数也有
CLCDbConnection::~CLCDbConnection(void)
{
if(m_Conn!=NULL)
{
delete m_Conn;
m_Conn=NULL;
}
}
AndonVC 2007-06-15
  • 打赏
  • 举报
回复
m_pDbCon->Release();中已经delete this了啊

//如下
void CLCDbConnection::Release()
{
delete this;
}

to : WizardK()
还是不行啊

to:pioneer_public()
是的,代码在上面
pioneer_public 2007-06-15
  • 打赏
  • 举报
回复
m_pDbCon->Release();
是释放的吗?
WizardK 2007-06-15
  • 打赏
  • 举报
回复
Close()里"m_pDbCon = NULL"前要"delete m_pDbCon"
eduyu 2007-06-15
  • 打赏
  • 举报
回复
没仔细看代码,你这句m_pDbCon=new CLCDbConnection();对应的delete呢?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧