又是一个bug吗?(200分)

  • 主题发起人 主题发起人 yeskert1
  • 开始时间 开始时间
Y

yeskert1

Unregistered / Unconfirmed
GUEST, unregistred user!
太惊人了!
下面这些(棕色的)别看了,直接看讨论吧,在那里我修改了问题。
这里我给注释掉:
[brown]{我构造一个简单的例子说明我的问题。
下面代码完成的功能一样,即将表中所有字段(5个字段)的内容添加到memo1中。
代码1:
procedure TForm1.Button1Click(Sender: TObject);
var v:array of variant;
i:integer;
begin
adotable1.tablename:=tbl1;
provider1.dataset:=adotable1;
clientdataset1.provider:=provider1;
//
with clientdataset1 do begin
open;
setlength(v,clientdataset1.FieldCount);
first;
repeat
for i:=0 to 4 do begin
v:=fields.Value;
memo1.Lines.Add(v);
end;
next;
until eof;
close;
end;
end;
代码2:
procedure TForm1.Button1Click(Sender: TObject);
var v:array of variant;
i:integer;
begin
adoquery1.sql.text:='select * from tbl1';
provider1.dataset:=adoquery1;;
clientdataset1.provider:=provider1;
//
with clientdataset1 do begin
open;
setlength(v,clientdataset1.FieldCount);
first;
repeat
for i:=0 to 4 do begin
v:=fields.Value;
memo1.Lines.Add(v);
end;
next;
until eof;
close;
end;
end;
代码3:
procedure TForm1.Button1Click(Sender: TObject);
var v:array of variant;
i:integer;
begin
adoquery1.sql.text:='select * from tbl1';
provider1.dataset:=adoquery1;;
clientdataset1.provider:=provider1;
//
with clientdataset1 do begin
open;
setlength(v,clientdataset1.FieldCount);
first;
repeat
memo1.Lines.Add(fields[0].Value) ;
memo1.Lines.Add(fields[1].Value) ;
memo1.Lines.Add(fields[2].Value) ;
memo1.Lines.Add(fields[3].Value) ;
memo1.Lines.Add(fields[4].Value) ;
next;
until eof;
close;
end;
end;
说明:字段中有一个是memo类型的字段,问题跟它有关。如果不设计这个字段则一切正常,如果涉及这个字段,则“代码2”有内存泄漏,而“代码1”和“代码3”正常。

理解不了!
不知道是动态数组出问题了,还是adoquery?还是clientdataset?
?????????????????}
[/brown]
 
我看不出
1和2有什麼分別..(除了那句sql)
但..你說是2有問題...
我想1會有問題吧..
 
1、3都正常,只有2内存泄漏。
 
不对啊,我测试的结果是1和2都泄漏,3 没问题!
 
嗯,我感觉肯能是Variant和OleVariant不能完全兼容导致的。

我试了一下,如果换成OleVariant类型,就可以了。
 
[h2][red]太令人惊讶了![/red][/h2]
[h2][blue]兄弟们快来研究研究:[/blue][/h2]
我有一个access数据库,其中一个表objects的结构如下:
objects{
obj_id text
obj_name text
type text
img OLEObject
f_remark memo
f_special number
url text
}
请注意字段的顺序。这个表是有若干数据的,
adoquery1的sql是这样的:select * from objects
clientdataset1指向provider1,provider1指向adoquery1,
然后请看下面的代码,你一定目瞪口呆:

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
with clientdataset1 do begin
open;
first;
repeat
{// 方法1
for i:=0 to 5 do begin
memo1.Lines.Add(fields.Value);
end; }
// 方法2
for i:=0 to 4 do begin
memo1.Lines.Add(fields.Value);
end;
memo1.Lines.Add(fields[5].Value);
{// 方法3
memo1.Lines.Add(fields[0].Value);
memo1.Lines.Add(fields[1].Value);
memo1.Lines.Add(fields[2].Value);
memo1.Lines.Add(fields[3].Value);
memo1.Lines.Add(fields[4].Value);
memo1.Lines.Add(fields[5].Value);}
next;
until eof;
end;
end;
兄弟们,你们说上面的三种方法有区别吗?应该是没有吧!但是2是有内存泄漏的,1、3都正常。

注:第一种方法,如果是for i:=0 to 4 do,那么也是内存泄漏!

谁愿意研究,我把数据表和代码发过去,请留email。
 
我的delphi是7.0(build8.1)
 
ligj_163@163.com 发来看看~
 
我没测试你的代码,但我觉的你的 variant变量最后都没有释放呀,还有用
setlength(v,clientdataset1.FieldCount); 这种方法分配variant类内存似乎不太好吧!
我觉得下面这才是正规的用法
var

datas:Variant;

begin
datas:=varArrayCreate([1,100,1,20],varVariant);
//分配了一个 100X20的Variant数组
try
....
finally
datas:=Unassigned;
//没这句内存不会释放
end;
 
to bmsr:
已经跟动态数组没有关系了!感觉是tField.value(tfield的getvalue)有问题。
 
朋友们,我发现,如果用asString代替value,则不会有内存泄漏!
 
不会吧,这个大家都每天都在用千百回,有漏洞老早就闹大了!反正这个我是从没发现内存漏洞.
 
你们的内存漏洞是工具扫描还是其他什么方法??
 
to bmsr:
首先,如果不涉及blog字段没有问题;
其次,涉及blog字段时,也不一定有问题,这才是可怕的!
再次,即使有问题,也不影响程序运行,如果不注意/不在意内存的情况,一般不会发现。

>>你们的内存漏洞是工具扫描还是其他什么方法??
我用MemProof 0.9.5
 
liqj_:
研究的怎么样了?
 
就这样了!
 

Similar threads

S
回复
0
查看
702
SUNSTONE的Delphi笔记
S
S
回复
0
查看
663
SUNSTONE的Delphi笔记
S
S
回复
0
查看
878
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部