与CAsyncSocket有关问题

来源:百度知道 编辑:UC知道 时间:2024/06/10 10:35:02
我用CAsyncSocket编写了一个聊天程序,编译没有问题,但在运行过程中,调用send()函数和receive()函数发送和接收消息时候会弹出一个对话框,提示内存不足,不知道大家有没有碰到过这种情况,能不能告诉我一般出现这种错误的原因?

因为代码过长,只列出了send和receive中的部分代码
send()的代码如下:
UpdateData(true);
m_receive+=m_send;
m_receive+="\r\n";

chatlen=m_send.GetLength();
char* data=new char[chatlen+1];
strcpy(data,m_send.GetBuffer(0));
m_send.ReleaseBuffer();

m_clientsock->Send(&chatlen,sizeof(int));
m_clientsock->Send(data,chatlen);
m_send="";
delete data;
UpdateData(false);
receive()的代码如下:
int chatlen;
m_clientsock->Receive(&chatlen,sizeof(int));
char* data=new char[chatlen+1];
memset(data,0,chatlen+1);
m_clientsock->Receive(data,chatlen+1);
m_receive+=data;
m_receive+="\r\n";
UpdateData(false);
delete data;
return ;
补充一下,有时候发送消息可以成功,有时候会提示内存不足

1、send 中不必new! 直接这么写m_clientsock->Send(m_send.GetBuffer(0),m_send.GetLength());就可以。
2、 Receive中你检测了收到的大小了吗,如果接收错误,这个数值也许很大。int chatlen;
m_clientsock->Receive(&chatlen,sizeof(int)); 对这个chatlen检测一下。或者调试看看。

问题就是这两个问题。

分数很诱人啊,呵呵
QQ:652545212
程序发给我,我帮你改下 :-)

再次补充:
在receive()开头把int chatlen初始化为0;
因为如果Receive失败的话,这个整数是随机的,会很大。
另外,
建议对发送及接收的函数返回值进行检测,你这样写很危险。

从这段代码看不出问题,

一般提示内存不足有几个情况:
死循环,或逻辑循环回路;
频繁调用的指针和对象没有释放,通常建议将创建语句放在循环外更好。

我认为应该就是chatlen=m_send.GetLength();返回的长度出了问题,很可能是N大。
像这类错误,设置个断点调试下,就可以知道在哪出错,错在哪里。

问题原因:Sock发送的大小不是无限制的,最大每次只能发送16k的数据.
解决方法:每次发送的时候判断一下大小再发.

看了你的代码,你这个代码好像还有点问题:
chatlen=m_send.GetLength();
char* data=new char[chatlen+1];
strcpy(data,m_send.GetBuffer(0));
m_send.ReleaseBuffer();

这里没把data清空.也就是你多分配了一个字节做为结尾,但结尾不是0.
应该是这样:
chatlen=m_send.GetLength();
char* data=new char[chatlen+1