ReadFile异常0xC0000005

yunhaiC QQ654777694 2018-04-06 09:56:11
template <typename TYPE>
bool read(HANDLE hPipe,TYPE &data)
{
DWORD size=sizeof(TYPE),dwBytesRead=0;
bool ret=ReadFile(hPipe,&data,size,&dwBytesRead,NULL);
return ret;
}

bool readString(HANDLE hPipe,string &str)
{
DWORD size,dwBytesRead=0;
char *c;
bool ret=read(hPipe,(int &)size);
if(ret&&size>0 )
{
c=new char[size+1]; //这里报错0xC0000005
ret=ReadFile(hPipe,c,size,&dwBytesRead,NULL);
c[size]='\0';
str= string(c);
}
return ret;
}

大部分情况下都没问题,就是在读取大量次数之后,偶尔会出现空指针c

请教解决方法,感谢
...全文
727 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2018-04-09
  • 打赏
  • 举报
回复
大问题没有,就是没有释放内存。不过代码太啰嗦了,合并成一个不就完了。还搞一个 template,但是 TYPE 还要强行转成 int * 是何道理?
bool readString(HANDLE hPipe, string &str)
{
	DWORD dwBytesRead;
	DWORD dwLength = 0;
	DWORD dwBuffer = sizeof(dwLength);
	BOOL bResult = ReadFile(hPipe, (void *)&dwLength, dwBuffer, &dwBytesRead, NULL);
	if (bResult && dwLength > 0)
	{
		char *psz = new char[dwLength + 1];
		bResult = ReadFile(hPipe, (void *)psz, dwLength, &dwBytesRead, NULL);
		str = string(psz);
		delete[] psz;
	}
	return bResult;
}
自信男孩 2018-04-08
  • 打赏
  • 举报
回复
new之后没有对其释放空间吧(delete) 尤其是在大量读的情况下,很有可能导致堆上的空间申请枯竭,导致new申请失败。建议根据需要是否在不需要的时候将new的空间释放掉(delete)
赵4老师 2018-04-08
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
paschen 2018-04-06
  • 打赏
  • 举报
回复
出错时中断下来分析原因,检查内存有没申请成功,size的值是否正常之类
paschen 2018-04-06
  • 打赏
  • 举报
回复
bool ret=read(hPipe,(int &)size);建议改成:bool ret=read(hPipe,size);,检查read函数里检查读到的值等是否有问题
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
出错时中断下来分析原因,检查内存有没申请成功,size的值是否正常之类
bool ret=read(hPipe,(int &)size); 这行size不正常 c=new char[size+1]; //这里报错0xC0000005 导致这行不正常 但是问题是,大部分情况下都是正常的
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
出错时中断下来分析原因,检查内存有没申请成功,size的值是否正常之类
size不正常,但是该怎么解决呢朋友,因为我主要是用C#编程,也是偶尔用c,所以比较糊涂

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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