寫了一個DATASNAP流傳遞的小程式,在釋放TServerMethods1Client物件時提示invalid pointer operation錯誤,懇請各位高人指點。
procedure TForm12.ListView1Click(Sender: TObject);
const
BufferSize = 102400; // 100 KB
var
fStream: TFilestream;
stream:Tstream;
BytesReadCount: Integer;
Buffer: TBytes;
filename:string;
cs:TServerMethods1Client;
begin
if ListView1.ItemIndex=-1 then exit;
Image1.Picture.Graphic:=nil;
cs:=TServerMethods1Client.Create(dm1.SQLConnection1.DBXConnection);
filename:='C:\TEMP\TEMP.JPG';
if SysUtils.FileExists(FileName) then
fStream := TFilestream.Create(FileName, fmOpenWrite or fmShareDenyNone)
else fStream := TFilestream.Create(FileName, fmCreate);
stream:=cs.DownLoadFile(ClientDataSet2.FieldByName('存盤目錄').AsString+ListView1.Items[ListView1.ItemIndex].Caption);
try
SetLength(Buffer, BufferSize);
fStream.Position := 0;
repeat
BytesReadCount := stream.Read(Buffer[0], BufferSize);
if BytesReadCount > 0 then
fStream.Write(Buffer[0], BytesReadCount);
until BytesReadCount < BufferSize;
finally
//cs.Destroy;
//cs.Free;//這兩條陳述句都提示invalid pointer 錯誤
fStream.Free;
stream.Free;
end;
end;
uj5u.com熱心網友回復:
free內部是會呼叫destroy(self <> nil)uj5u.com熱心網友回復:
不要Free CS,改為CS := nil;uj5u.com熱心網友回復:
樓上這么做不安全,一個函式的解構式中有釋放子物件的陳述句,直接將物件賦為nil會導致子物件占用記憶體泄漏,用free最安全。我想樓主失敗的原因可能是CS內部的問題。。uj5u.com熱心網友回復:
有些類是繼承于介面,介面會自己釋放。
uj5u.com熱心網友回復:
所謂子物件,就是在物件的create函式中創建的一些輔助物件,如TImage在create中創建了一個叫Picture的TPicture型別物件,這個即子物件,此物件的解構式只在TImage.Free中出現。因此若不呼叫TImage.Free,Picture物件就永遠也無法析構!uj5u.com熱心網友回復:

FreeAndNil(CS);
uj5u.com熱心網友回復:
謝謝大家的熱心,上面的方法都試過了,還是不行,執行到釋放CS就彈invalid pointer operation錯誤
uj5u.com熱心網友回復:
查下cs有關代碼。uj5u.com熱心網友回復:
TServerMethods1Client這個名字怎么這么奇怪?里面有個1。。。uj5u.com熱心網友回復:
今天我也遇到這個問題了,來網上查,只有你的帖子涉及這個問題,雖然這個帖子時間很久了,但我現把代碼貼出來,供你分析一下,找到原因希望共享一下!var
aserver:TServerMethodsClient;
cm:TClientModule;
ja:TJSONArray;
begin
cm:=TClientModule.Create(nil);
try
aserver :=cm.ServerMethodsClient;
ja :=TJSONArray.Create;
try
ja :=aserver.GetTestJSONArray('123','123');
ShowMessage(ja.ToString);
finally
//ja.free;//只要加入這個,則執行到下面cm.Free的時候就報“invalid pointer operation”錯誤
end;
finally
cm.Free;
end;
end;
uj5u.com熱心網友回復:
貌似 cm.free時,就要進行 ja.free;ja是不是 cm的子物件?
uj5u.com熱心網友回復:
我也遇到了此問題,貌似無解?只能用try except end 解決,實際上應該是沒有釋放。uj5u.com熱心網友回復:
有一個 overload的方法 多個 Boolean 的引數。
以前我也遇到過,時間長了,記不清怎么回事。
cs:=TServerMethods1Client.Create(dm1.SQLConnection1.DBXConnection, True/FALSE);
試試. 反正印象中這個引數有時候也管用。 僅當參考吧。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/130137.html
標籤:網絡通信/分布式開發
