但是從任務管理器中看記憶體占用就24M多點.
另外我也改了所new跟delete匹配的問題,而且考慮到TCP客戶端可能中間任意位置退出,還把new,delete按下面這種格式來寫了.
try
{
new ...
}
__finally
{
delete ...
}
另外,出現"Out of memory"提示后,點確定,程式還是會繼續運行,直以好多次后,好幾天后崩潰.
有兩個TIdTCPServer,一個平常有130個左右的連接,另一個是5個左右.
uj5u.com熱心網友回復:
升級到最新版的indy吧uj5u.com熱心網友回復:
這個我覺得只能是記憶體泄漏的原因吧,除了new delete之外還有沒有別的記憶體處理uj5u.com熱心網友回復:
現在用的是CB2010的indy10
uj5u.com熱心網友回復:
一般提示"Out of memory",是什么記憶體不足,因為任務管理器里面看記憶體只使用了24M多.
其它的....
Functions called:
delete (21 times)
fflush (6 times)
fwrite (6 times)
fclose (45 times)
fread (2713 times)
fopen (45 times)
stat (40 times)
delete[] (84350 times)
new[] (84350 times)
memset (1083 times)
SysReallocMem (669540 times)
SysFreeMem (6104307 times)
SysGetMem (6104323 times)
strdup (4 times)
free (112 times)
_lsetlocale (6 times)
new (30 times)
calloc (10 times)
strlen (68 times)
realloc (1 times)
malloc (97 times)
memcpy (75322 times)
Resource types used:
object array (84350 allocs, 3 max)
object (30 allocs, 30 max)
memory block (6104426 allocs, 5737 max)
file stream (45 allocs, 2 max)
file handle (45 allocs, 2 max)
Modules used:
00400000 11/18/2013 14:58:04 D:\hyj\server\server.exe
==========================================
uj5u.com熱心網友回復:
是不是連接太多,或在反復連,SOCKET沒有真真釋放uj5u.com熱心網友回復:
連接現在也有100多個吧,倒是經常會斷開再重新連接,應該有釋放吧,我有定時去查看
idtcpsrvr1->Contexts->LockList()->Count 顯示出來的連接數就是樓主位的那么多而已.
uj5u.com熱心網友回復:
讓專業的工具干專業的事,讓不專業的別干事;放開那些函式,讓FastMM來吧。uj5u.com熱心網友回復:
cb2010怎么用FastMM,程式里面還會動態加載dll,dll程式也要改嗎?
uj5u.com熱心網友回復:
TIdTCPServer 的 OnExecute 事件是在執行緒內執行的因此絕對不要在 OnExecute 事件內進行對與控制元件界面重繪相關的操作
原因是: 會引起訊息阻塞.
例如:
OnExecute() 事件
{
NetwowkSpeed->Caption = IntToStr(Value); // NetwowkSpeed 是 TLabel
}
改成:
加一個組件 TTimer * Timer1
加一個變數: int SpeedValue
OnExecute() 事件
{
SpeedValue = Value;
}
建一個 TTimer
Timer1Timet() 事件
{
NetwowkSpeed->Caption = IntToStr(SpeedValue);
}
這樣做才不會出現 "Out of memory"
uj5u.com熱心網友回復:
如果是:try
{
new ...
}
__finally
{
delete ...
}
基本上與 new跟delete匹配的問題 無關!
uj5u.com熱心網友回復:
是的,我現在執行緒中都沒有關于界面和資料庫相關的操作,都是每個執行緒有一個相應的結構中暫存,然后主執行緒中一個timer定時去處理.
另外后面那個
try
{
new ...
}
__finally
{
delete ...
}
有沒有可能 new 的時候回傳null,然后后面又執行了delete而出現錯誤?
uj5u.com熱心網友回復:
基本上沒可能, 要么改成:obj = new ...
if (obj)
try
{
...
}
__finally
{
delete obj;
}
uj5u.com熱心網友回復:
一般指標錯誤是 AVuj5u.com熱心網友回復:
像這個嵌套也是沒問題的吧
try
{
new ...
try
{
new ...
}
__finally
{
delete ...
}
}
__finally
{
delete ...
}
uj5u.com熱心網友回復:
不知樓主解決了問題沒有,很想聽下文uj5u.com熱心網友回復:
還沒解決
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/130041.html
標籤:網絡及通訊開發
上一篇:如何像VSPD一樣通過編程實作添加一對連接的虛擬串口
下一篇:如何獲得設備的完整名稱?
