首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-01-08 
realloc触发 _ASSERTE(_CrtIsValidHeapPointer(pUserData))昨晚给的示例表述太模糊。重新发帖://全局函数b

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))

热点排行