new开辟了一个指针数组,在撤销;在开辟,在撤销,此时VS报错?

O112358 2010-10-21 08:31:46
我想,先定义一个指针变量,再用new开辟了一个指针数组,在撤销;在开辟,在撤销,此时VS报错?(因为前后两个大小不同)
我调试过了,其他的没问题,就出在最后一个delete,郁闷。。?
这代码没语法错误啊,只是动态改变了空间大小而已,求解。。。。
详见代码
bool RecvData(ServerInfo &Server,char *Data, int Length)
{
USES_CONVERSION;
int RetVal=0,DataLength=0;
char *TmpData;
RStatu RecvStatu=Successed;
CString TmpInfo=L"",TmpInfo_=L"";
TmpInfo.Format(L"%d",Length);
DataLength=Length+TmpInfo.GetLength()+::SocketHead.GetLength()+::SocketHead_Tail.GetLength()+::SocketTail.GetLength();//数据包长度
TmpData=new char[DataLength];
ZeroMemory(TmpData,DataLength);
RetVal=::recv(Server.ClientSocket,TmpData,DataLength,0);
if(RetVal==SOCKET_ERROR)
{
closesocket(Server.ClientSocket);
WSACleanup();
MessageBox(::GetActiveWindow(),_T("接收客户端数据失败!客户端可能以离线"),_T("温馨提示"),MB_ICONERROR|MB_OK);
delete [] TmpData;
return false;
}
::UnPack(TmpData,Data,&RecvStatu);//解壳函数
delete [] TmpData;
if(RecvStatu==Successed)
{
TmpInfo=_T("I have already successfully received your information!");
TmpInfo_.Format(L"%d",TmpInfo.GetLength());
DataLength=TmpInfo.GetLength()+TmpInfo_.GetLength()+::SocketHead.GetLength()+::SocketHead_Tail.GetLength()+::SocketTail.GetLength();
TmpData=new char[DataLength];
ZeroMemory(TmpData,DataLength);
::Pack(W2A(TmpInfo),TmpData,TmpInfo.GetLength());//加壳函数
RetVal=::send(Server.ClientSocket,TmpData,DataLength,0);//发送确认信息
if(RetVal==SOCKET_ERROR)
{
closesocket(Server.ClientSocket);
WSACleanup();
MessageBox(::GetActiveWindow(),_T("向客户端发送数据失败!客户端可能以离线"),_T("温馨提示"),MB_ICONERROR|MB_OK);
delete [] TmpData;
return false;
}
delete [] TmpData;
}
return true;
}
...全文
225 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
O112358 2010-10-21
  • 打赏
  • 举报
回复
问题解决。。
仔细看了几遍发现,的确是指针越界了,多跑了1个字节
多谢各位了。。
结。。。
qq120848369 2010-10-21
  • 打赏
  • 举报
回复
小心你还没delete就修改了内存块的临界区或者内存块信息单元,delete就不知道delete成啥了.
O112358 2010-10-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lizhong2613 的回复:]
请问楼主这种代码是怎么粘贴的,我怎么粘贴上就是文本
你的却可以拖动???
[/Quote]
编辑框有啊(编辑框菜单第七个),或者自己打“
”就行了,中间是你的代码。。
dskit 2010-10-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 feng0112358 的回复:]
引用 4 楼 dskit 的回复:
必然是这个函数出了问题

::Pack(W2A(TmpInfo),TmpData,TmpInfo.GetLength());//加壳函数

问题的原因是在这个函数的面发生了内存践踏,请检查,应该是写数据长度超过了TmpData的大小

如果数组越界,那应该在那条语句执行后就应该报错啊??
怎么会等到执行到delete是才报错?
[/Quote]

以后遇到这种问题不要把精力放在 delete 这句了,直接去找发生内存践踏的地方
dskit 2010-10-21
  • 打赏
  • 举报
回复
内存踩踏的时候并不报错,而是等到下次分配或释放时才报错!!!
O112358 2010-10-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dskit 的回复:]
必然是这个函数出了问题

::Pack(W2A(TmpInfo),TmpData,TmpInfo.GetLength());//加壳函数

问题的原因是在这个函数的面发生了内存践踏,请检查,应该是写数据长度超过了TmpData的大小
[/Quote]
如果数组越界,那应该在那条语句执行后就应该报错啊??
怎么会等到执行到delete是才报错?
dskit 2010-10-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 shexinwei 的回复:]
第二次分配以后看一下分配成功没有?

调用new动态分配以后,使用以下检测一下总是好习惯:

C/C++ code

p = new int[4];
if(p != NULL)
{
·
·
}
else
{
printf("error on new!!");
return false;
}
[/Quote]

new 没有必要检查,要么分配成功,要么抛出异常退出
dskit 2010-10-21
  • 打赏
  • 举报
回复
必然是这个函数出了问题

::Pack(W2A(TmpInfo),TmpData,TmpInfo.GetLength());//加壳函数

问题的原因是在这个函数的面发生了内存践踏,请检查,应该是写数据长度超过了TmpData的大小
lizhong2613 2010-10-21
  • 打赏
  • 举报
回复
请问楼主这种代码是怎么粘贴的,我怎么粘贴上就是文本
你的却可以拖动???
shexinwei 2010-10-21
  • 打赏
  • 举报
回复
第二次分配以后看一下分配成功没有?

调用new动态分配以后,使用以下检测一下总是好习惯:

p = new int[4];
if(p != NULL)
{
·
·
}
else
{
printf("error on new!!");
return false;
}

65,189

社区成员

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

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