send()发送数据内存泄露,每次循环4k增加,急求!

midle110 2012-11-23 02:04:47
写客户端和服务器的时候,发送出问题了。
每次发送就会增加4K内存,我基本山没有申请内存。
大家看看我代码:

//定义接受压缩图片的信息
typedef struct bmpheader
{
int indexBitmap; //图片索引号
int x , y ; //图片的 横向、纵向 块号
int nLength ; //块压缩之后的大小
int nSum ; //计数块
int nDisplay ;
}BMPHEADER , *pBMPHEADER;

//接受发送标志
void CalgrDlg::RecvFlag()
{
memset( (void*)buff , 0 , strlen(SINGEL_SEND) );

recvData(buff , sizeof(SINGEL_SEND) );
if ( memcmp( (void*)buff , SINGEL_SEND , sizeof(SINGEL_SEND) ) != 0 )
{
flag_out = 0 ;
MessageBox( _TEXT("接受标志错误!") );
}

}

//接收数据
void CalgrDlg::recvData( char *temp , int len )
{
recvtotal = 0 ;
recvthistime = 0 ;
while ( recvtotal < len )
{
recvthistime = recv( SockClient , temp + recvtotal , len - recvtotal , 0 );
recvtotal += recvthistime ;
}
}
//发送数据
void CalgrDlg::sendData( char *temp , int len )
{
recvtotal = 0 ;
recvthistime = 0 ;
while ( recvtotal < len )
{
recvthistime = send( SockClient , temp + recvtotal , len - recvtotal , 0 ) ;
recvtotal += recvthistime ;
}
}

这个函数里面send有问题,发送就会增加4k内存
void CalgrDlg::GetScreen1() //获取屏幕内存地址
{
SendBmpheader.indexBitmap++;
SendBmpheader.nSum = 0 ;



bmp.m_hObject = ::CreateDIBSection( memdc.m_hDC , &bi ,DIB_RGB_COLORS ,(LPVOID*)&pbitmaps2, NULL , 0 );

memdc.SelectObject(&bmp);
memdc.BitBlt( 0 , 0 ,nWidth , nHeith ,pdeskdc1 , 0,0,SRCCOPY );

// cmp(pbitmaps , pbitmaps2);
SendBmpheader.nDisplay = 1 ;

RecvFlag();
sendData( (char*)&SendBmpheader , lenOfBmpheader ) ;

bmp.DeleteObject();
}





我创建了一个线程,里面就是循环调用GetScreen1()这个函数。
但是每次用sendData()发送数据之后 ,内存就会增加4K,我删除sendData()函数内存就很稳定。
但是我需要发送数据,求大神解释啊 !


...全文
557 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
chengguiyue87 2015-01-29
  • 打赏
  • 举报
回复
请教楼主,这个问题怎么解决的呢?多谢!
  • 打赏
  • 举报
回复
怎么解决的?
yaozhiyong110 2012-11-24
  • 打赏
  • 举报
回复
楼上都给出答案了
看不见的裂痕 2012-11-24
  • 打赏
  • 举报
回复
引用 2 楼 midle110 的回复:
引用 1 楼 schlafenhamster 的回复: HBITMAP old=(HBITMAP)memdc.SelectObject(&amp;bmp); ... memdc.SelectObject(old); 否则: bmp.DeleteObject(); 不起作用。 这个没问题,能看看 溢出的位置吗 ?
你到底尝试了没有?我看下来也是这个问题。
xiaohuh421 2012-11-24
  • 打赏
  • 举报
回复
引用 6 楼 midle110 的回复:
写成你这样之后,每次释放之后,系统都需要重新申请资源,那是相当的慢。
你说得没错, 这样肯定是慢. 但也不会存在,"相当的慢" 这么严重. 如果图片区域的大小不变的话, 你可以把 HBITMAP hBmp = ::CreateDIBSection( memdc.m_hDC , &bi ,DIB_RGB_COLORS ,(LPVOID*)&pbitmaps2, NULL , 0 ); //emdc.SelectObject(&bmp); HBITMAP hOldBmp = (HBITMAP)::SelectObject(memdc.m_hDC, hBmp); 这两句放到初始化中. 也就是你创建memdc的地方. 把 ::SelectObject(memdc.m_hDC, hOldBmp); ::DeleteObject(hBmp); 放到资源释放的地方. 这样,你的 GetScreen1()函数中只需要调用 memdc.BitBlt( 0 , 0 ,nWidth , nHeith ,pdeskdc1 , 0,0,SRCCOPY ); // cmp(pbitmaps , pbitmaps2); SendBmpheader.nDisplay = 1 ; RecvFlag(); sendData( (char*)&SendBmpheader , lenOfBmpheader ) ; 这几句就够了.
midle110 2012-11-24
  • 打赏
  • 举报
回复
写成你这样之后,每次释放之后,系统都需要重新申请资源,那是相当的慢。
引用 3 楼 xiaohuh421 的回复:
GetScreen1 这里的DC资源释放是个问题. memdc.SelectObject(&bmp); 这一句要对应一个SelectObject, 把原来的选择回去. ::CreateDIBSection 这个函数也要对应一个DeleteObject; 你调用bmp.DeleteObject();只是把bmp对象删除了, 但是函数CreateDIBS……
midle110 2012-11-24
  • 打赏
  • 举报
回复
谢谢大家,问题解决了
midle110 2012-11-23
  • 打赏
  • 举报
回复
引用 4 楼 whereisrxy 的回复:
memdc.ReleaseDC()这个呢?
这个属于 全局变量,最后释放
xiaoyu_code 2012-11-23
  • 打赏
  • 举报
回复
memdc.ReleaseDC()这个呢?
xiaohuh421 2012-11-23
  • 打赏
  • 举报
回复
GetScreen1 这里的DC资源释放是个问题. memdc.SelectObject(&bmp); 这一句要对应一个SelectObject, 把原来的选择回去. ::CreateDIBSection 这个函数也要对应一个DeleteObject; 你调用bmp.DeleteObject();只是把bmp对象删除了, 但是函数CreateDIBSection返回的 句柄是否被删除还不好说. 代码写成这样:
void CalgrDlg::GetScreen1()     //获取屏幕内存地址
{
    SendBmpheader.indexBitmap++;
    SendBmpheader.nSum = 0 ;
     
 
 
    HBITMAP hBmp = ::CreateDIBSection( memdc.m_hDC , &bi ,DIB_RGB_COLORS ,(LPVOID*)&pbitmaps2, NULL , 0     );
 
    //emdc.SelectObject(&bmp);
    HBITMAP hOldBmp = (HBITMAP)::SelectObject(memdc.m_hDC, hBmp);
    memdc.BitBlt( 0 , 0 ,nWidth , nHeith ,pdeskdc1 , 0,0,SRCCOPY );
 
//  cmp(pbitmaps , pbitmaps2);
    SendBmpheader.nDisplay = 1 ;
 
   RecvFlag();
    sendData( (char*)&SendBmpheader , lenOfBmpheader  ) ;
 
    //bmp.DeleteObject();
   ::SelectObject(memdc.m_hDC, hOldBmp);
   ::DeleteObject(hBmp); //如是hBmp句柄没被删除, 则CreateDIBSection返回的缓冲区内存就不会被释放
}
midle110 2012-11-23
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
HBITMAP old=(HBITMAP)memdc.SelectObject(&bmp); ... memdc.SelectObject(old); 否则: bmp.DeleteObject(); 不起作用。
这个没问题,能看看 溢出的位置吗 ?
schlafenhamster 2012-11-23
  • 打赏
  • 举报
回复
HBITMAP old=(HBITMAP)memdc.SelectObject(&bmp); ... memdc.SelectObject(old); 否则: bmp.DeleteObject(); 不起作用。

18,363

社区成员

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

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