突然的内存泄漏问题

时间:2019-07-01 05:35:56

标签: c++ memory-leaks mfc c-strings

环境: Windows 10家庭版10.0.16299

MS Visual Studio Community 2017版本15.6.6

编译设置:64位-多字节字符集

几天以来,我面临着一个非常烦人的内存泄漏问题。我做了很多尝试,但问题仍然存在。

突然,我在应用程序退出时收到以下消息:

{7196} normal block at 0x000001FD42D0EA90, 66 bytes long.
 Data: <`  f    )   )   > 60 C6 CC 66 F7 7F 00 00 29 00 00 00 29 00 00 00 

f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\oleinit.cpp(84) : {749} client block at 0x000001FD40F735F0, subtype c0, 104 bytes long.

f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dumpcont.cpp(23) : atlTraceGeneral - a CCmdTarget object at $000001FD40F735F0, 104 bytes long

f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\plex.cpp(29) : {747} normal block at 0x000001FD40F78750, 248 bytes long. Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\occmgr.cpp(794) : {746} normal block at 0x000001FD40F5F1D0, 8 bytes long.
 Data: <   f    > F0 BB A3 66 F7 7F 00 00 

在应用程序退出时我也收到以下消息(实际上我有12条消息)

{348} normal block at 0x00000236C88FE4A0, 69 bytes long.
 Data: <` >     ,   ,   > 60 C6 3E BE F6 7F 00 00 2C 00 00 00 2C 00 00 00 

所以,当我添加以下行.....

_CrtSetBreakAlloc(348);

编译器中断消息xxxx.exe触发了一个断点。

总是在同一地方:线

'pData = (CStringData*)malloc( nTotalSize );' in  CAfxStringMgr::Allocate

CStringData* CAfxStringMgr::Allocate( int nChars, int nCharSize ) throw()
{
    size_t nTotalSize;
    CStringData* pData;
    size_t nDataBytes;

    ASSERT(nCharSize > 0);

    if(nChars < 0)
    {
        ASSERT(FALSE);
        return NULL;
    }

    nDataBytes = (nChars+1)*nCharSize;
    nTotalSize = sizeof( CStringData )+nDataBytes;
    pData = (CStringData*)malloc( nTotalSize );
    if (pData == NULL)
        return NULL;
    pData->pStringMgr = this;
    pData->nRefs = 1;
    pData->nAllocLength = nChars;
    pData->nDataLength = 0;

    return pData;
}

将CString作为参考参数传递的函数出现了问题。像这样一个:

int CFoo::GetData(CString strMainData, CString& strData, int nPos, int nLen)
{
    strData = strMainData.Mid(nPos + 2, nLen);

    return ( nPos + 2 + nLen);
}

任何线索我为什么得到这个?从几周以来我一直在开发该应用程序。我从未遇到过这个问题。我修改了函数以使用char *作为参数,并在调用函数中将其复制到CSring,但问题仍然存在。此行为在两周前出现(但我没有直接注意到)。可以是编译器设置吗?

0 个答案:

没有答案