TServerMethods1Client对象释放时提示invalid pointer operation错误

yangzhi_jn 2012-11-22 10:47:57
写了一个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;
...全文
667 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
CACACACACA 2013-07-08
  • 打赏
  • 举报
回复
有一个 overload的方法 多个 Boolean 的参数。 以前我也遇到过,时间长了,记不清怎么回事。 cs:=TServerMethods1Client.Create(dm1.SQLConnection1.DBXConnection, True/FALSE); 试试. 反正印象中这个参数有时候也管用。 仅当参考吧。
大风吹过脸颊 2013-07-08
  • 打赏
  • 举报
回复
我也遇到了此问题,貌似无解?只能用try except end 解决,实际上应该是没有释放。
yunankuangke 2013-05-03
  • 打赏
  • 举报
回复
貌似 cm.free时,就要进行 ja.free; ja是不是 cm的子对象?
d26579800 2013-04-14
  • 打赏
  • 举报
回复
今天我也遇到这个问题了,来网上查,只有你的帖子涉及这个问题,虽然这个帖子时间很久了,但我现把代码贴出来,供你分析一下,找到原因希望共享一下! 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;
hsfzxjy 2012-11-23
  • 打赏
  • 举报
回复
TServerMethods1Client这个名字怎么这么奇怪?里面有个1。。。
UnkownState 2012-11-23
  • 打赏
  • 举报
回复
查下cs有关代码。
yangzhi_jn 2012-11-23
  • 打赏
  • 举报
回复
谢谢大家的热心,上面的方法都试过了,还是不行,执行到释放CS就弹invalid pointer operation错误
feiba7288 2012-11-22
  • 打赏
  • 举报
回复
不要Free CS,改为CS := nil;
UnkownState 2012-11-22
  • 打赏
  • 举报
回复
free内部是会调用destroy(self <> nil)
e8923704 2012-11-22
  • 打赏
  • 举报
回复
FreeAndNil(CS);
hsfzxjy 2012-11-22
  • 打赏
  • 举报
回复
所谓子对象,就是在对象的create函数中创建的一些辅助对象,如TImage在create中创建了一个叫Picture的TPicture类型对象,这个即子对象,此对象的析构函数只在TImage.Free中出现。因此若不调用TImage.Free,Picture对象就永远也无法析构!
feiba7288 2012-11-22
  • 打赏
  • 举报
回复
引用 3 楼 HSFZXJY 的回复:
楼上这么做不安全,一个函数的析构函数中有释放子对象的语句,直接将对象赋为nil会导致子对象占用内存泄漏,用free最安全。我想楼主失败的原因可能是CS内部的问题。。
有些类是继承于接口,接口会自己释放。
hsfzxjy 2012-11-22
  • 打赏
  • 举报
回复
楼上这么做不安全,一个函数的析构函数中有释放子对象的语句,直接将对象赋为nil会导致子对象占用内存泄漏,用free最安全。我想楼主失败的原因可能是CS内部的问题。。

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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