为什么会占用内存呢?

yipulong 2006-04-28 02:05:08
代码如下:定时的检查,连接;可是每执行一次,程序所占的内存就增加一些(已知:有几个是断着连不上的)
TSendSMapit Findsit;
for (Findsit = SendSMap.begin();Findsit != SendSMap.end();Findsit++)
{
if ((*Findsit).second!= NULL &&(*Findsit).second->cSocket!= NULL &&!(*Findsit).second->cSocket->Active&&(*Findsit).second->cSocket->Socket->SocketHandle==-1)
{
try
{
(*Findsit).second->cSocket->Active = true;
}
catch(...)
{
Application->MessageBoxA(".........","提示",MB_OK + MB_ICONINFORMATION);
}
}
}
...全文
422 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
soloxiao 2006-05-10
  • 打赏
  • 举报
回复
改成阻塞式,在接收数据的同时隔一段时间发送一个测试包,发送失败则已断线,然后disconnect
pp616 2006-05-08
  • 打赏
  • 举报
回复
Application->Minimize();
Application->Restore();
pp616 2006-04-30
  • 打赏
  • 举报
回复
放个定时器。每10分钟把程序最小化一次。或许有效果。

yipulong 2006-04-30
  • 打赏
  • 举报
回复
用窗体的windowstate来改变窗口状态好象不管用哦;不过手动点击最小化还是能看到程序使用内存下降的;但是虚拟内存不会降哦
你定时最小化怎么做的?
yipulong 2006-04-29
  • 打赏
  • 举报
回复
测试了下,比如计算机启动时看性能,站用内存200M;然后运行程序约3个小时后,内存站用260M左右,关闭程序,内存降到230M左右;之后又不起程序,让计算机自己呆着,运行时间不很长,但发现它自己好象也长内存。
现在做的处理时连接N次后未连接上,告警提示,如果需要重连,手动执行。(我们的系统出现重连的情况应该是很少见,所以这样处理也能过的去吧)
3996906 2006-04-28
  • 打赏
  • 举报
回复
我想问。。关闭程序能不能完全释放内存呢?

如果能完全释放。。。那就无语了。。
铖邑 2006-04-28
  • 打赏
  • 举报
回复
连接吃内存这也是正常的,关键是当你把连接关闭后,是否会恢复到原来的状态。

如果连接数量过多,用控件来实现是不太合适的,最后考虑优化 。
yipulong 2006-04-28
  • 打赏
  • 举报
回复
Addsends是有几个连接就执行几次(在程序启动时执行);之后不会再执行ADDSENDS
我现在是不明白,就那句=true;为什么会导致内存增加而且不释放呢??按理说这句话本身是没有问题,我就不明白还有哪会因为=true而导致内存泄露呢??

如果我有500个连接的话,不出2个小时,内存就会增加100M以上;跑一晚上就会吃光计算机所有内存
pp616 2006-04-28
  • 打赏
  • 举报
回复
楼主是有几个连接就调几次AddSendS吧。
如果是new就没问题。不new才会有问题。
铖邑 2006-04-28
  • 打赏
  • 举报
回复
如果你是阻塞式的socket,因为连接不成功时所花的时间较长,所以一分钟时间可能会不够。你最好用非阻塞方式吧
yipulong 2006-04-28
  • 打赏
  • 举报
回复
咕嘟,我刚才在看关于SOCKET的帖子,SOCKET重连间隔需要多少?我现在的定时间隔是1分钟,难道还要间隔再大点?
铖邑 2006-04-28
  • 打赏
  • 举报
回复
3996906(我只是建议,不提供最后的解决方法)

多谢支持啊。

codeguard有时也会误报的,以前经常发现
yipulong 2006-04-28
  • 打赏
  • 举报
回复
codeguard不管用
3996906 2006-04-28
  • 打赏
  • 举报
回复
xpdavis(咕嘟) ( )要申请做斑竹当表率。。。

俺就不哗众取宠了。。。

友情提示:打开codeguard
yipulong 2006-04-28
  • 打赏
  • 举报
回复
因为一般我这是有5个scNo所以AddSends一般是在程序一开始执行5次;代码如下:
AnsiString strSql = " select * from scTable";
TADOQuery* ADOQuery = new TADOQuery(Application);
if (DbOp.OpenSql(strSql,ADOQuery))
{
while (!ADOQuery->Eof)
{
SendReceive1->AddSendS(ADOQuery->FieldByName("sc")->AsInteger,ADOQuery->FieldByName("IpAddress")->AsString,
ADOQuery->FieldByName("IpPort")->AsInteger);
ADOQuery->Next();
}

这应该没问题
铖邑 2006-04-28
  • 打赏
  • 举报
回复
我认为不对,如果AddSendS只调用一次,那么SendSMap只有一个元素???怪了
yipulong 2006-04-28
  • 打赏
  • 举报
回复
addsends只在程序启动时执行1次;现在的问题是定时执行部分每走一次,内存占用就会增加一些,而且不会释放
铖邑 2006-04-28
  • 打赏
  • 举报
回复
定时执行那部分没有什么问题,但是你这个AddSendS方法是不能重复调用的,只能调用一次,否则就会出现“吃内存”的现象。你在那2个“new”之前,要先检查scNo是否已经在SendSMap中存在,如果存在,而那几个指针又不是NULL的话,就不需要“new”了
yipulong 2006-04-28
  • 打赏
  • 举报
回复
程序启动时初始化,对每个scNo执行下边的函数
void __fastcall TGKSendReceive::AddSendS(int scNo,AnsiString IpAddress,int Port)
{
TSendS *SendS;
TClientSocket *CSocket;
SendS = new (TSendS);
CSocket = new TClientSocket(NULL);
SendS->cSocket = CSocket;
SendS->cSocket->Address = IpAddress;
SendS->cSocket->Port = Port;
SendS->cSocket->Name = "M"+AnsiString(scNo);
SendS->cSocket->OnRead = ClientSocketRead;
SendS->cSocket->OnError = ClientSocketError;
SendS->cSocket->OnConnect = HandleSocketConnect;
SendS->cSocket->OnDisconnect = HandleSocketDisConnect;
SendS->cSocket->Active = true;
TGKReceiveHandle *ReceiveHandle;
ReceiveHandle = new TGKReceiveHandle(NULL);
ReceiveHandle->OnHandleFrame = HandleReceive;
ReceiveHandle->OnCheckFrame = CheckFrameEvent;
ReceiveHandle->Capacity = 20480;
ReceiveHandle->LenPos = FLenPos;
ReceiveHandle->LenTypeIsWord = FLenPosType;
ReceiveHandle->FrameMaxLen = 1000;
ReceiveHandle->FrameMinLen = 1;
ReceiveHandle->Name = "M"+AnsiString(scNo);
SendS->ReceiveHandle = ReceiveHandle;
SendSMap[scNo] = SendS;
}
之后定时的执行我提问时给出的代码
检查active==false并且sockethandle==-1的进行重新置true;现在出的长内存就在这句话上,难道=true有问题?需要其他什么操作?
铖邑 2006-04-28
  • 打赏
  • 举报
回复
呵呵,应该不是断开连接的问题。

来电说的意思应该是,把所有的cSocket->Active = false;

但是不见得能解决问题。
最好能把代码给得全一点,好查出问题。
加载更多回复(4)

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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