堆分配问题 当我试图在Visual Studio 2012中运行C++程序时,我遇到内存错误。我认为这段代码是原因(因为当我删除它时,它运行良好):

堆分配问题 当我试图在Visual Studio 2012中运行C++程序时,我遇到内存错误。我认为这段代码是原因(因为当我删除它时,它运行良好):,c++,visual-c++,memory-management,visual-studio-2012,heap,C++,Visual C++,Memory Management,Visual Studio 2012,Heap,然后,如果我离开函数并删除此代码: strHashHex.Preallocate(33); strHashHex = cMD5.HexHash(); 那么它也会工作得很好。所以我想知道这是否是导致内存问题的代码,如果是,我如何修复它 以下是CMD5类(它利用Windows API生成MD5总和): class CMD5 { 公众: CMD5(){ if(CryptAcquireContext(&m_hCryptProv,NULL,MS_ENHANCED_PROV,PROV_RS

然后,如果我离开函数并删除此代码:

    strHashHex.Preallocate(33);
    strHashHex = cMD5.HexHash();
那么它也会工作得很好。所以我想知道这是否是导致内存问题的代码,如果是,我如何修复它

以下是CMD5类(它利用Windows API生成MD5总和):

class CMD5
{
公众:
CMD5(){
if(CryptAcquireContext(&m_hCryptProv,NULL,MS_ENHANCED_PROV,PROV_RSA_FULL,CRYPT_NEWKEYSET)==0){
如果(GetLastError()==NTE_存在){
CryptAcquireContext(&m_-hCryptProv,NULL,MS_-ENHANCED_-PROV,PROV_-RSA_-FULL,0);
}
}
}
~CMD5(){
如果(m_hCryptProv)
CryptoReleaseContext(m_hCryptProv,0);
m_hCryptProv=NULL;
免费(m_szHash);
}
布尔计算(LPCTSTR szText){
DWORD dwLen=sizeof(TCHAR)*\u tcslen(szText);
德沃德·德哈斯伦;
DWORD dwHashLenSize=sizeof(DWORD);
if(CryptCreateHash(m_hCryptProv、CALG_MD5、0、0和m_hHash)){
if(CryptHashData(m_hHash,(常量字节*)szText,dwLen,0)){
if(CryptGetHashParam(m_hHash,HP_HASHSIZE,(字节*)&dwHashLen,&dwHashLenSize,0)){
if(m_szHash=(字节*)malloc(dwHashLen)){
if(CryptGetHashParam(m_hHash,HP_HASHVAL,(字节*)m_szHash和dwHashLen,0)){
加密哈希(m_hHash);
}
}
}
}
}
返回false;
}
布尔计算(常量LPBYTE szText,DWORD dwLen){
德沃德·德哈斯伦;
DWORD dwHashLenSize=sizeof(DWORD);
if(CryptCreateHash(m_hCryptProv、CALG_MD5、0、0和m_hHash)){
if(CryptHashData(m_hHash,(常量字节*)szText,dwLen,0)){
if(CryptGetHashParam(m_hHash,HP_HASHSIZE,(字节*)&dwHashLen,&dwHashLenSize,0)){
if(m_szHash=(字节*)malloc(dwHashLen)){
if(CryptGetHashParam(m_hHash,HP_HASHVAL,(字节*)m_szHash和dwHashLen,0)){
加密哈希(m_hHash);
}
}
}
}
}
返回false;
}
LPBYTE Hash()常量{
LPBYTE szHash=新字节[16];
零内存(szHash,16);
memcpy(szHash,m_szHash,16);
返回szHash;
}
LPTSTR HexHash()常量{
LPTSTR szBuf=新TCHAR[33];
零存储器(szBuf,33);

对于(int i=0;i,通过将CMD5::HexHash()函数更改为

    void HexHash(CString &strHash) {
        for (int i=0; i<16; i++)
            strHash += StringFormat(_T("%02X"), m_szHash[i]);

        return;
    }
void HexHash(CString&strHash){

对于(int i=0;我可以发布一个吗?该代码太长了,我怀疑是否有人会阅读它来发现您的问题。我只能猜测:由于取消对
Preallocate
的调用会让您的问题消失,您确定要释放在那里分配的内存吗?(查看RAII和智能指针)还可以考虑使用一个剖析器来告诉你MeMeRebug在哪里。你是不是只调用这个代码一次或多次?第一种情况下,它可能是内存损坏问题,第二个是内存泄漏。你能创建一个极简的例子,用发布的代码来复制这个问题吗?你也可以尝试使用MS的应用程序验证器。t使用CString多年-是否有可能
strHashHex.Preallocate(33);strHashHex=cMD5.HexHash();
分配两次内存,并且在
cMD5.HexHash()
中分配的内存永远不会释放?计算散列(MD5(数据1)+MD5(数据2)+…)与对不同的哈希(MD5(data1)xor MD5(data2)…)进行异或运算相比,没有任何安全优势。更好的是MD5(data1+data2…)。这段代码中的
Preallocate(33)
调用毫无价值,正如Philipp指出的,由
CMD5::HexHash()分配的原始字符串缓冲指针
在调用代码中泄漏。该函数应返回一个by val
CString
,(如果您正确实现它,这几乎可以保证是正确的)。修复泄漏和其他错误,然后查看您是否仍然存在问题。
class CMD5
{
public:
    CMD5() {
        if(CryptAcquireContext(&m_hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET) == 0){
            if(GetLastError() == NTE_EXISTS){
                CryptAcquireContext(&m_hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0);
            }
        }
    }

    ~CMD5() {
        if(m_hCryptProv) 
            CryptReleaseContext(m_hCryptProv, 0);
        m_hCryptProv = NULL;
        free(m_szHash);
    }

    bool Calculate(LPCTSTR szText) {
        DWORD dwLen = sizeof(TCHAR) * _tcslen(szText);
        DWORD dwHashLen;
        DWORD dwHashLenSize = sizeof(DWORD);

        if (CryptCreateHash(m_hCryptProv, CALG_MD5, 0, 0, &m_hHash)) {
            if (CryptHashData(m_hHash, (const BYTE*)szText, dwLen, 0)) {
                if (CryptGetHashParam(m_hHash, HP_HASHSIZE, (BYTE *)&dwHashLen, &dwHashLenSize, 0)) {
                    if(m_szHash = (BYTE*)malloc(dwHashLen)) {
                        if (CryptGetHashParam(m_hHash, HP_HASHVAL, (BYTE*)m_szHash, &dwHashLen, 0)) {
                            CryptDestroyHash(m_hHash);
                        }
                    }
                }
            }
        }

        return false;
    }

    bool Calculate(const LPBYTE szText, DWORD dwLen) {
        DWORD dwHashLen;
        DWORD dwHashLenSize = sizeof(DWORD);

        if (CryptCreateHash(m_hCryptProv, CALG_MD5, 0, 0, &m_hHash)) {
            if (CryptHashData(m_hHash, (const BYTE*)szText, dwLen, 0)) {
                if (CryptGetHashParam(m_hHash, HP_HASHSIZE, (BYTE *)&dwHashLen, &dwHashLenSize, 0)) {
                    if(m_szHash = (BYTE*)malloc(dwHashLen)) {
                        if (CryptGetHashParam(m_hHash, HP_HASHVAL, (BYTE*)m_szHash, &dwHashLen, 0)) {
                            CryptDestroyHash(m_hHash);
                        }
                    }
                }
            }
        }

        return false;
    }

    LPBYTE Hash() const {
        LPBYTE szHash = new BYTE[16];

        ZeroMemory(szHash, 16);

        memcpy(szHash, m_szHash, 16);

        return szHash;
    }

    LPTSTR HexHash() const {
        LPTSTR szBuf = new TCHAR[33];

        ZeroMemory(szBuf, 33);

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

        szBuf[32]=0;

        return szBuf;
    }
private:
    BYTE *m_szHash;
    DWORD m_hHash;
    HCRYPTPROV m_hCryptProv;
};
    void HexHash(CString &strHash) {
        for (int i=0; i<16; i++)
            strHash += StringFormat(_T("%02X"), m_szHash[i]);

        return;
    }