socket send函数的奇怪之处

lucyking 2009-10-23 03:44:42
long CMFCWinSockCtrl::SendDataNEW(SOCKET sock,char *data, int dataLength, int timeout)
{
if(!sock)//未与客户端建立连接
return -1;
if(dataLength<0)
return -2;
if(timeout<0)
return -2;

timeval tv;
fd_set fdwrite;
int len = 0;
//送出信息至服务器
FD_ZERO(&fdwrite);
tv.tv_sec = timeout;//指定时间后返回
tv.tv_usec = 0;
FD_SET(sock,&fdwrite);//是否可以发送数据
select(0,NULL,&fdwrite,NULL,&tv);
if(FD_ISSET(sock,&fdwrite))
{
len = send(sock, data, dataLength, 0);//发送数据

if(len<=0)
{
return -101;//无法发送数据,对方可能已断开连接
}
}
else
{
return 0;//网络超时
}
return len;
}


问题是这样的 send(sock, data, dataLength, 0);如果传入的是数据的实际长度 会有内存泄漏
当我把datalength设为1000的时候 就没有内存泄漏了

我自已做了个测试 len=send(sock,"hello,accp",10,0); 会有内存泄漏
len=send(sock,"hello,accp",11,0); 不会有内存泄漏
...全文
82 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxyshenyou 2009-10-23
  • 打赏
  • 举报
回复
我也很郁闷VC的内存问题,我写过一个类,类中定义私有成员变量 char *sss;然后构造的时候用一个字符串赋值给sss
CFastAnalyse::CFastAnalyse(char *sourcemessage)
{
CString TypeChange;
TypeChange=sourcemessage;
TypeChange.Replace(" 10 82"," 02");
TypeChange.Replace(" 10 83"," 03");
TypeChange.Replace(" 10 94"," 14");
TypeChange.Replace(" 10 92"," 12");
TypeChange.Replace(" 10 90"," 10");
sss=(LPSTR)(LPCTSTR)TypeChange;
}

在它的析构函数中什么都没有写,结果并没有内存泄漏,这也还能理解,因为我没有从内存动态的分配空间,只是在栈中分配,类一销毁控件自动回收了应该(不知道是不是这样)!!

后来我想改成动态分配内存试试,于是我先定义
char *zzz;
然后在构造函数中写
zzz=new char[100];

然后在析构函数中
delete[] zzz;


结果这种方法总是出错??不知道还有没有哪位朋友遇到一样问题了
哈利路亚1874 2009-10-23
  • 打赏
  • 举报
回复
字符串是以\0结尾的,注意一点就行了!
哈利路亚1874 2009-10-23
  • 打赏
  • 举报
回复
真是的,这种问题怎么能直接给字符串的长度呢,直接使用len=send(sock,"hello,accp",sizeof("hello,accp"),0); 让编译器帮你维护,岂不更好!
TADICAN 2009-10-23
  • 打赏
  • 举报
回复
学习
快乐鹦鹉 2009-10-23
  • 打赏
  • 举报
回复
嗯。还需要一个终止符\0,长度要加1
kaflash 2009-10-23
  • 打赏
  • 举报
回复
字符串是 0 结尾的

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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