|
楼主发表于: 2012-11-22 10:47:57
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; |
|
#1 得分:0回复于: 2012-11-22 11:07:00
free内部是会调用destroy(self <> nil)
|
|
|
#2 得分:0回复于: 2012-11-22 11:34:50
不要Free CS,改为CS := nil;
|
|
|
#3 得分:0回复于: 2012-11-22 13:41:06
楼上这么做不安全,一个函数的析构函数中有释放子对象的语句,直接将对象赋为nil会导致子对象占用内存泄漏,用free最安全。我想楼主失败的原因可能是CS内部的问题。。
|
|
|
#4 得分:0回复于: 2012-11-22 13:46:11
有些类是继承于接口,接口会自己释放。 |
|
|
#5 得分:0回复于: 2012-11-22 13:52:33
所谓子对象,就是在对象的create函数中创建的一些辅助对象,如TImage在create中创建了一个叫Picture的TPicture类型对象,这个即子对象,此对象的析构函数只在TImage.Free中出现。因此若不调用TImage.Free,Picture对象就永远也无法析构!
|
|
|
#6 得分:0回复于: 2012-11-22 16:17:10
![]() FreeAndNil(CS); |
|
|
#7 得分:0回复于: 2012-11-23 13:50:55
谢谢大家的热心,上面的方法都试过了,还是不行,执行到释放CS就弹invalid pointer operation错误 |
|
#8 得分:0回复于: 2012-11-23 14:04:00
查下cs有关代码。
|
|
|
#9 得分:0回复于: 2012-11-23 16:49:27
TServerMethods1Client这个名字怎么这么奇怪?里面有个1。。。
|
|
|
#10 得分:0回复于: 2013-04-14 15:57:57
今天我也遇到这个问题了,来网上查,只有你的帖子涉及这个问题,虽然这个帖子时间很久了,但我现把代码贴出来,供你分析一下,找到原因希望共享一下!
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; |
|
|
#11 得分:0回复于: 2013-05-03 15:40:11
貌似 cm.free时,就要进行 ja.free;
ja是不是 cm的子对象? |
|
#12 得分:0回复于: 2013-07-08 01:29:57
我也遇到了此问题,貌似无解?只能用try except end 解决,实际上应该是没有释放。
|
|
|
#13 得分:0回复于: 2013-07-08 23:39:04
有一个 overload的方法 多个 Boolean 的参数。 以前我也遇到过,时间长了,记不清怎么回事。 cs:=TServerMethods1Client.Create(dm1.SQLConnection1.DBXConnection, True/FALSE); 试试. 反正印象中这个参数有时候也管用。 仅当参考吧。 |
|
delphi lazarus opengl
网页操作自动化, 图像分析破解,游戏开发


谢谢大家的热心,上面的方法都试过了,还是不行,执行到释放CS就弹invalid pointer operation错误