CString CInventoryView::MyVariantToString(CDBVariant var)
{
/////////////检测内存是否泄漏
#ifdef _DEBUG
CMemoryState oldMemState, newMemState, diffMemState;
oldMemState.Checkpoint();
#endif CString strValue="";
//*
switch(var.m_dwType)
{
case DBVT_STRING:
strValue = *(var.m_pstring);
break;
case DBVT_NULL:
strValue = "";
break;
case DBVT_DATE:
strValue.Format("%d-%2d-%2d",
var.m_pdate->year,
                            var.m_pdate->month,
                             var.m_pdate->day);
break;
case DBVT_SHORT:
strValue.Format("%d",var.m_iVal);
break;
case DBVT_LONG:
strValue.Format("%d",var.m_lVal);
break;
default:
strValue="";
}
#ifdef _DEBUG
newMemState.Checkpoint();
if( diffMemState.Difference( oldMemState, newMemState ) )
{
TRACE( "Memory leaked In CInventoryView::MyVariantToString(CDBVariant var)!\n" );
}
#endif
return strValue;
}以上这个函数会内存泄漏,为什么?怎么解决?

解决方案 »

  1.   

    这样检查不行呀?
    CString 是变长的字符数组。只是它自己处理分配、释放内存等事情。
    CString 对象变长时会多分配出内存。
    比如你这样检查就会觉得“内存泄漏”,事实上strTest生命期结束会自己释放内存。
    /////////////检测内存是否泄漏
    #ifdef _DEBUG
    CMemoryState oldMemState, newMemState, diffMemState;
    oldMemState.Checkpoint();
    #endif
    CString strTest;
    strTest = "dsgfghgjfujrtyretgfdhf";
                      //strTest = "";//如果加上这句就又不会弹出下面的对话框了。 #ifdef _DEBUG
    newMemState.Checkpoint();
    if( diffMemState.Difference( oldMemState, newMemState ) )
    {
    AfxMessageBox( "Memory leaked " );
    }
    #endif
      

  2.   

    hnyyy(前进),谢谢你的指点。那我该怎样检测以上的函数是否内存泄漏?以你的经验,以上的函数会内存泄漏吗?