从Visual Studio 2010迁移到2012后的内存错误

时间:2012-12-19 06:46:36

标签: visual-c++ memory-management memory-leaks visual-studio-2012

我的库在Visual Studio 2010中运行良好,但现在每当我在2012年编译运行它时,我都会遇到这些内存错误:

First-chance exception at 0x76884B32 in Example.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0101F3A0.
First-chance exception at 0x76884B32 in Example.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0101F3A0.
Unhandled exception at at 0x76884B32 in Example.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0101F3A0.
First-chance exception at 0x76FF3541 (ntdll.dll) in Example.exe: 0xC0000005: Access violation reading location 0xFEFEFF02.

根据调用堆栈,每次从以下代码调用return wstring(cMD5.hexdigest());时出现错误:

wstring GetMachineHash() {
     BYTE szHash[48];
     LPBYTE pIdentifierHash;

     ZeroMemory(szHash, 48);

     MachineNameIdentifier cNameId;
     pIdentifierHash = cNameId.GetIdentifierHash();

     memcpy(szHash, pIdentifierHash, 16);

     NetworkAdapterIdentifier cNetAdaptId;
     pIdentifierHash = cNetAdaptId.GetIdentifierHash();

     memcpy(szHash+16, pIdentifierHash, 16);

     VolumeInfoIdentifier cVolInfo;
     pIdentifierHash = cVolInfo.GetIdentifierHash();

     memcpy(szHash+32, pIdentifierHash, 16);

     MD5 cMD5(szHash, 48);

     return wstring(cMD5.hexdigest());
}

如果你想知道我正在使用的MD5类,它是Frank Thilo的一个端口,但它被修改为返回LPBYTE而不是std :: string,如下所示:

// return 16 byte md5 hash
LPBYTE MD5::hash() const {
    if (!finalized)
        return 0;

    return (LPBYTE)digest;
}

// return hex representation of digest as string
LPTSTR MD5::hexdigest() const
{
    if (!finalized)
        return NULL;

    LPTSTR szBuf = new TCHAR[33];

    ZeroMemory(szBuf, 33);

    for (int i=0; i<16; i++)
        _stprintf_s(szBuf+i*2, 33, _T("%02X"), digest[i]);

    szBuf[32]=0;

    return szBuf;
}

在这里做了一些关于SO的研究之后,它说这些错误是因为我的程序中的其他地方可能存在内存泄漏。但我已经看了,似乎所有东西都被正确释放了。有任何想法吗?我想知道这是否也可能与通过LoadLibrary()GetProcAddress()从EXE调用DLL库有关?

(我还应注意平台工具集设置为Visual Studio 2012 - Windows XP (v110_xp)

0 个答案:

没有答案