如果該行:ClientCommunication.Free;
正在引發異常。 你可以在這裏做幾件事。
FreeAndNil
通過調用freeandnil(AObject)
替換調用AObject.free
。
如果你只是免費的,舊的指針仍然有一個非零引用,並且Assigned(AObject)
將不能分辨釋放和活動的對象。
謹防克隆
你可能犯下的另一個錯誤是,你喜歡克隆對象這樣:
Object1:= TObject1.Create;
//.... lots of code
Object2:= Object1;
//.... lots of code
FreeAndNil(Object2); <<-- freeing the clone-reference is a mistake
//.... lots of code
Object1.Free; <<-- exception: it's already freed
FastMM4選項
從http://sourceforge.net/projects/fastmm/
它下載最新的FastMM4 (*)
那些哨子是額外的診斷模式,使喲你的程序死了很慢,但也發現了很多你似乎正在遭受的堆腐敗錯誤。
打開defines.inc
並改變這一點:
{$ifdef DEBUG}
{.$define EnableMemoryLeakReporting}
{.$define FullDebugMode}
{.$define RawStackTraces}
{$endif DEBUG}
進入這個
{$ifdef DEBUG}
{$define EnableMemoryLeakReporting}
{$define FullDebugMode}
{$define RawStackTraces}
{$define CatchUseOfFreedInterfaces} <<-- very useful
{$define LogMemoryLeakDetailToFile}
{$define LogErrorsToFile}
{$define CheckHeapForCorruption} <<-- :-)
{$endif}
有一個很好的文章在這裏:http://wiert.me/2009/07/29/delphi-fastmm-using-fastmm4-for-debugging-your-memory-allocations-part-1-introduction/
如果你不喜歡擺弄的INC文件,有一個小工具可以爲你做:http://jedqc.blogspot.com/2007/07/new-fastmm4-options-interface.html
(*)我認爲德爾福的一個也有大部分的調試工具,但不是100%肯定的。無論如何不能傷害到獲得最新(最大)的版本。
或緩衝區溢出時
如果您ClientCommunication
對象有自由意志,做一些額外的工作的一些內部結構。
想象一下下面的代碼:
TUnrelatedObject = class
buffer: array[0..99] of integer;
procedure DoWork;
end;
TUnrelatedObject.DoWork;
var
i: integer;
begin
for i:= 0 to 100 do buffer[i]:= maxint; <<-- buffer overrun
end;
試想一下,ClientCommunication
毗鄰UnrelatedObject
堆中。
對DoWork
的呼叫也會覆蓋ClientCommunication
的數據。
這可能會或可能不會觸發DoWork中的訪問衝突。如果沒有,那麼錯誤將很難追查,因爲它會出現在不同的和完全無關的地方。
在您的應用程序中啓用範圍檢查{$R+}
。
警告
記住不船調試版本給您的客戶。
所有的調試程序都會死機。
聞起來像堆腐敗。解決方案將涉及調試。只有你可以做到這一點。 –
_Heap corruption_很可能是這種情況,但我可以想象'.closeServerConnection()'方法會破壞'ClientCommunication'對象的父對象(通過回調或某些指針雜技),因此任何嘗試訪問它的操作都可能很容易導致到AV錯誤。無論哪種情況,您都可以嘗試通過向「ClientCommunication」及其父項添加監視來調試問題,然後逐行執行代碼並查看指針已釋放的位置。 **錯誤顯然不在上面顯示的代碼中** – mg30rg
我做了這種類型的調試,問題是父母實際上在close內部的任何地方都沒有被釋放。它只是將關閉命令發送到服務器並關閉連接。這就是爲什麼它很奇怪。但是,如果堆腐敗真的很奇怪。看看我能做些什麼,現在添加FastMM4來試試看看它是否能夠幫助解決問題。 – Johannes