realloc触发 _ASSERTE(_CrtIsValidHeapPointer(pUserData));解决方案
realloc触发 _ASSERTE(_CrtIsValidHeapPointer(pUserData));
昨晚给的示例表述太模糊。重新发帖:
realloc的size有小于和大于原来的长度。。
------解决方案--------------------
ReallocEx没有将新分配的内存返回啊!
调用的地方也要改改
if( !ReallocEx(m_pDataBuf, dwSize))
改成
if( !ReallocEx(&m_pDataBuf, dwSize))
昨晚给的示例表述太模糊。重新发帖:
//全局函数
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))