MyException - 我的异常网
当前位置:我的异常网» C++ » realloc触发 _ASSERTE(_CrtIsValidHeapPointer(pUse

realloc触发 _ASSERTE(_CrtIsValidHeapPointer(pUserData));解决方案

www.MyException.Cn  网友分享于:2013-01-09  浏览:179次
realloc触发 _ASSERTE(_CrtIsValidHeapPointer(pUserData));
昨晚给的示例表述太模糊。重新发帖:


//全局函数
bool ReallocEx(void * pBuffer, unsigned int size)
{
if( size == 0 )
{
return false;
}
void * pNewBuffer = realloc(pBuffer, size);
if( pNewBuffer == NULL )
{
//重新申请内存出错,原来的内存没变,free掉
free(pBuffer);
return false;
}
pBuffer = pNewBuffer;
return true;
}

//
class MyWinHttp
{
private:
void * m_pData;
};



BOOL MyWinHttp::DownLoadFile( LPCWSTR pwszObjectName, LPCSTR pszOutFile )
{
/*
...........
........*/       //其他代码
//类前面有初始化m_pDataBuf有malloc预留了8192k
FILE * pfile;
pfile = fopen(pszOutFile, "wb");
if( !pfile )
{
return FALSE;
}
while(1)
{
DWORD  dwSize = 0;
DWORD  dwDownLoadBytes = 0;

if (!WinHttpQueryDataAvailable( hRequest, &dwSize)) 
{
printf( "Error %u in WinHttpQueryDataAvailable.\n", GetLastError());
return FALSE;
}
if( dwSize == 0)
break;

        //在执行一定次数之后,realloc触发了_ASSERTE(_CrtIsValidHeapPointer(pUserData));
//注意是文件够大,5M以上,执行一定次数循环
if( !ReallocEx(m_pDataBuf, dwSize)) 
{
return FALSE;
}

ret = WinHttpReadData(hRequest, m_pDataBuf, dwSize, &dwDownLoadBytes);
if( !ret )
{
printf("读取数据失败,err=%d\n",GetLastError());
continue;
}
if( dwDownLoadBytes == 0 )
break;
fwrite(m_pDataBuf, 1, dwDownLoadBytes, pfile);

}

WinHttpCloseHandle(hRequest);

fclose(pfile);

return TRUE;

}




realloc的size有小于和大于原来的长度。。
------解决方案--------------------
ReallocEx没有将新分配的内存返回啊!


bool ReallocEx(void **ppBuffer, unsigned int size)
{
    if( size == 0 )
    {
        return false;
    }
    void * pNewBuffer = realloc(*ppBuffer, size);
    if( pNewBuffer == NULL )
    {
        //重新申请内存出错,原来的内存没变,free掉
        free(*ppBuffer);
        return false;
    }
    *ppBuffer = pNewBuffer;
    return true;
}


调用的地方也要改改
if( !ReallocEx(m_pDataBuf, dwSize))
改成
if( !ReallocEx(&m_pDataBuf, dwSize))

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有