内存泄漏:Detected memory leaks

xiaohe185 2009-10-12 01:03:52
//对话框类,调用CSCItemCount类
void CSCCountDlg::OnOK() //计算功能
{
CSCItemCount scItemCount;
CString strValue;
double dStandCost(0);

try
{

m_pPDMItem = new CPDMObject;
m_pPDMItem->m_pClass = pItemCls;
m_pPDMItem->InitColumnContentList();
m_pPDMItem->m_nObjectID = m_nObjectID;


if( !scItemCount.LoadSubItem(

m_pdmSel.m_nObjectID,m_pPDMItem,pBomCls,perdef1.m_lstFO,m_pChGlobarVar ) )
{
throw 101;

}

dStandCost = scItemCount.m_dStandCost;

}
if( NULL != m_pPDMItem )
delete m_pPDMItem;

}
catch( ... )
{

if( NULL != m_pPDMItem )
delete m_pPDMItem;
return ;
}


m_dStandCost = dStandCost;
UpdateData( false );
}

//CSCItemCount 类,与对话框类不在同一DLL中

BOOL CSCItemCount::LoadSubItem( UINT nObjectID,CPDMObject *pItemObj, CPDMClass *pBomCls,
COptionList &lstFo,CCheckGlobalVar

*pChGlobarVar )
{
COleDateTime tmCurSys;
CString strProduct, strTime;
CPDMResourceMgr mgrResource( _T("pdmcore.dll") );
CAConnect myConnect;
CString strCount;

strProduct= _T("");
//1) 获取服务器当前时间
if( !DLLGetSysCurDate( strTime, tmCurSys ) )
tmCurSys = COleDateTime::GetCurrentTime();

//2) 连接数据库
if ( !CCommFun::ConnectDB( myConnect, m_strServer, m_strDBName, m_strDBUser, m_strDBPwd ) )
return false;

_CONNECT_PDMSERVER_RETURN()
m_pItemObj = pItemObj;
m_pItemObj->m_fQuantityOld = m_pItemObj->m_fQuantity;

//3) BOM展开
if( !this->LoadChildItem( myConnect,session, pItemObj, pItemObj->m_pClass ,pBomCls, m_lstItem,

lstFo, tmCurSys, strProduct , pChGlobarVar ) )
return false;

//计算,根据m_lstItem记录的内容从数据库读取内容
m_lstItem.RemoveAll( );

return true;
}


BOOL CSCItemCount::LoadChildItem ( CAConnect &myConnect,CSession &session,CPDMObject *pItemObj,
CPDMClass *pItemCls,CPDMClass *pBomCls, CObList &lstItem, COptionList &lstFo, COleDateTime tmCurSys,
CString strProduct,CCheckGlobalVar *pChGlobarVar )
{
CPDMObjectList::Position pos;
CSCItemCount *pSubItem = NULL;
CString strMPType,strControl, strStock;
CFieldList lstField;
BOOL bFolder = false;
CItemOperate ItemOperate;
CString strErr;
double dStandCost(0);
double dCost(0);

//1) 获取指定物料的指定信息
ItemOperate.m_pGlobalVar = pChGlobarVar;
if( !ItemOperate.GetItemInfo( session, pItemObj->m_nObjectID, pItemObj->m_pClass->m_strTabName,

strStock, strControl, strMPType, strErr ) )
{
AfxMessageBox( strErr );
return false;
}
//2) 记录BOM展开所得的所有物料对象
this->m_dSCost = 0;
lstItem.AddTail( this );

//3) NN?(是否控制-是否入库)
if( (strControl.CompareNoCase(_T("N")) ==0) && (strStock.CompareNoCase(_T("N")) == 0 ) )
{
//3.1) 获取ITEM的子项列表
GetSubItemPDMObjList( session, pItemObj, pBomCls, strProduct, tmCurSys, lstFo, lstField

);
//3.2) ITEM有子项,逐条获取其子项的子项,m_lstSubPDMObj将在对话框内delete pPDMItem时析构
if( pItemObj->m_lstSubPDMObj.NumItems() != 0 )
{
for( pItemObj->m_lstSubPDMObj.BeginScan( pos ); pos ; pos++ )
{
if( NULL == (*pos ) )
continue;
pSubItem = new CSCItemCount;
pSubItem->m_pItemObj = (*pos );
pSubItem->m_pParItem = pItemObj;
pSubItem->m_pParCount = this;
pSubItem->m_pItemObj->m_fQuantityOld = (pItemObj->m_fQuantityOld) *

((*pos)->m_fQuantity);
this->m_lstSub.AddTail( pSubItem );

if( !pSubItem->LoadChildItem( myConnect,session, (*pos ), pItemCls,

pBomCls, lstItem, lstFo, tmCurSys, strProduct,pChGlobarVar ) )
return false;
}
}
}

return true;
}

//析构函数
CSCItemCount::~CSCItemCount()
{
m_anID.RemoveAll();
DetachSubList();
}

void CSCItemCount::DetachSubList()
{
CSCItemCount *pItem =NULL;
POSITION pos;

for ( pos = m_lstSub.GetTailPosition(); pos; )
{
pItem = (CSCItemCount*)m_lstSub.GetPrev( pos );
if ( NULL != pItem )
{
delete pItem;
pItem = NULL;
}
}

m_lstSub.RemoveAll();
}
如上过程,我认为所有我new出的对象最后都delete了,但为什么程序正常结束后,会有大量的提示如下:

Detected memory leaks!
Dumping objects ->
{24158} normal block at 0x0B3D1EC8, 20 bytes long.
Data: < = m \ = > 00 00 00 00 F8 1D 3D 0B C4 6D F6 08 5C 1E 3D 0B
strcore.cpp(118) : {24157} normal block at 0x0B3D1E50, 45 bytes long.
Data: < 2930> 01 00 00 00 06 00 00 00 20 00 00 00 32 39 33 30
{24156} normal block at 0x0B3D1DF8, 20 bytes long.
Data: < = ( = g = > C8 1E 3D 0B 28 1D 3D 0B 8C 67 F6 08 8C 1D 3D 0B
strcore.cpp(118) : {24155} normal block at 0x0B3D1D80, 45 bytes long.
Data: < > 01 00 00 00 00 00 00 00 20 00 00 00 00 20 20 20
{24154} normal block at 0x0B3D1D28, 20 bytes long.
Data: < = X = Ta = > F8 1D 3D 0B 58 1C 3D 0B 54 61 F6 08 BC 1C 3D 0B
strcore.cpp(118) : {24153} normal block at 0x0B3D1CB0, 45 bytes long.
Data: < > 01 00 00 00 00 00 00 00 20 00 00 00 00 20 20 20
请高手指教
...全文
2241 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohe185 2009-10-13
  • 打赏
  • 举报
回复
自己UP
xiaohe185 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 shunruo 的回复:]
不是类型匹配的问题,是CString自身的问题,其析构中引用了类的一个静态数组_afxInitData,在DLL与EXE间传递CString对象时这个静态数组的地址可能不一致。
[/Quote]
这样我该怎么处理呢?将参数中的CString 改为 LPCTSTR就可以了吗?
chenyu2202863 2009-10-13
  • 打赏
  • 举报
回复
请看
http://www.codeproject.com/KB/applications/visualleakdetector.aspx
axing0123 2009-10-13
  • 打赏
  • 举报
回复
up
凤矶 2009-10-13
  • 打赏
  • 举报
回复
不是类型匹配的问题,是CString自身的问题,其析构中引用了类的一个静态数组_afxInitData,在DLL与EXE间传递CString对象时这个静态数组的地址可能不一致。
MoXiaoRab 2009-10-12
  • 打赏
  • 举报
回复
关注这个问题
xiaohe185 2009-10-12
  • 打赏
  • 举报
回复
不过就程序来看,应该没有定义与调用类型冲突,我再仔细检查一下
xiaohe185 2009-10-12
  • 打赏
  • 举报
回复
是的,字符串参数我一般都是用 CString的
好的,我试试用LPCTSTR
凤矶 2009-10-12
  • 打赏
  • 举报
回复
DLL么?
用了CString做参数吧?
不要用CString 做形参,也不要用它做返回值,改用LPCTSTR.

ssm1984119 2009-10-12
  • 打赏
  • 举报
回复
检查函数定义的参数类型与实际调用时使用的类型是否吻合,否则函数会进行隐型转换生成临时对象造成内存泄露。
xiaohe185 2009-10-12
  • 打赏
  • 举报
回复
我跟踪时发现内存主要在LoadChildItem 内泄漏,但我还是没明白什么地方会有泄漏?
CString我也是正常使用的啊,请帮忙看看
wangk 2009-10-12
  • 打赏
  • 举报
回复
提示strcore.cpp里,那么貌似是CString的用法不对导致的Leak,可能是GetBuffer后没有Release之类。
也可能是哪个结构包含CString却没正常释放。

16,471

社区成员

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

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

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