realloc出错

lihuanzhong 2010-08-19 06:35:03
void* pData = malloc(BUFFER_SIZE);

int nMallocTimes = 1;
int nPointer = 0;
int nStrCount = 0;
int nDataLen = 0;
TCHAR* lpszTemp = NULL;
void* pTempPointer = pData;

try
{
for( int i = 0; i < 16; i++ )
{
nStrCount = wcslen(szarrTemp[i]);
nDataLen = nStrCount * sizeof( TCHAR ) + 2;
int nOffset = ((char*)pTempPointer - (char*)pData);
if( ( nMallocTimes * BUFFER_SIZE - nOffset ) < sizeof( DWORD ) + nDataLen )
{//检测缓冲区
void* pDataNew = realloc(pData,BUFFER_SIZE);
if( NULL == pDataNew ) throw -1;
nMallocTimes++;
}

*(DWORD*)pTempPointer = nDataLen;
lpszTemp = (TCHAR*)( ( char* )pTempPointer + sizeof( DWORD ) );
wcscpy(lpszTemp,szarrTemp[i]);

pTempPointer = (char*)pTempPointer + sizeof( DWORD ) + nDataLen;
}
}catch(...)
{
free( pData );
return NULL;
}

这段代码如果去掉赋值的语句
*(DWORD*)pTempPointer = nDataLen;
lpszTemp = (TCHAR*)( ( char* )pTempPointer + sizeof( DWORD ) );
wcscpy(lpszTemp,szarrTemp[i]);
就不会出错,要不然就会在第三次调用realloc时出错
...全文
212 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
左手稻影 2011-10-17
  • 打赏
  • 举报
回复
不过楼主的realloc好像用的不对
realloc的第二个参数指定的是新的内存空间的大小 而不是增加的大小
左手稻影 2011-10-17
  • 打赏
  • 举报
回复
纠结··我也碰到了同样的问题
第三次调用relloc的时候出问题 百思不得其解··
whg01 2010-08-23
  • 打赏
  • 举报
回复
void* pDataNew = realloc(pData,BUFFER_SIZE); 每次realloc都是相同大小?写错了吧。估计你是想写成:
void* pDataNew = realloc(pData, nMallocTimes * BUFFER_SIZE);
lazy_2010 2010-08-19
  • 打赏
  • 举报
回复
realloc 不是不能用,只是不能在没有了解清楚的情况下用。
arong1234 2010-08-19
  • 打赏
  • 举报
回复
用realloc是很危险的,你不能保证每次都成功吧.假如你分配好的内存后面没有可用内存了,恐怕就有问题了
lazy_2010 2010-08-19
  • 打赏
  • 举报
回复
呵呵,再看看 realloc 的用法吧,不是自己写的函数,是系统 C 函数吧。
lihuanzhong 2010-08-19
  • 打赏
  • 举报
回复
lazy_2010:BUFFER_SIZE是一个常量,它代表每次添加的内存的大小 我的定义是 #define BUFFER_SIZE 50,您的说法好像不对
lazy_2010 2010-08-19
  • 打赏
  • 举报
回复
又看了看,觉得应该是

size_t nAlloc = sizeof( DWORD ) + nDataLen;
int nAllocBlock = (nAlloc + BUFFER_SIZE - 1) / BUFFER_SIZE;
... = realloc(pData, nAllocBlock * BUFFER_SIZE);

否则,还是会出现问题。
lazy_2010 2010-08-19
  • 打赏
  • 举报
回复
是不是应该

realloc(pData,BUFFER_SIZE * nMallocTimes);
lihuanzhong 2010-08-19
  • 打赏
  • 举报
回复
whg01:我试过realloc后pData = pDataNew;再将pTempPointer重新重置还是出同样的错误,而且调试过程中我查看过内存变化,由于堆中的内存足够,pData和realloc得到的pDataNew始终是一样的,而且第一次realloc后赋值都没有任何问题,只有在第二次调用realloc时会出错
whg01 2010-08-19
  • 打赏
  • 举报
回复
realloc(pData,BUFFER_SIZE); 执行完这句后,pData指向的内存会被释放,不能再使用。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧