定义了
type
TZD_Rec = Record
file_column :string;
file_column_order :integer;
file_column_value :string;
table_name :string;
table_column :string;
end;
pZD_Rec=^TZD_Rec;然后再一个函数里var 了一个局部变量 a:array of pZD_Rec;
这个函数中间运行的时候,我也SetLength(a,column_count);了
还
While not eof do
begin
a1:=ADOQuery1.fieldbyname('列名').AsString;
New(a[i]);
pZD_Rec(a[i])^.file_column:=a1;
pZD_Rec(a[i])^.file_column_order:=-1;
pZD_Rec(a[i])^.table_name:=ADOQuery1.fieldbyname('表名').AsString;
inc(i);
next;
end;
这个函数结束的时候,我也
for j:=0 to column_count-1 do
begin
if a[j]<> nil then
Dispose(a[j]);
end;但是我看Dispose没有用啊,比如:我再for j:=0 to column_count-1 do设了个断点,dispose一个指针后,我看刚dispose的那个指针还是没有变成nil,还是有值,这怎么回事啊?有没有人知道,拜托了。
type
TZD_Rec = Record
file_column :string;
file_column_order :integer;
file_column_value :string;
table_name :string;
table_column :string;
end;
pZD_Rec=^TZD_Rec;然后再一个函数里var 了一个局部变量 a:array of pZD_Rec;
这个函数中间运行的时候,我也SetLength(a,column_count);了
还
While not eof do
begin
a1:=ADOQuery1.fieldbyname('列名').AsString;
New(a[i]);
pZD_Rec(a[i])^.file_column:=a1;
pZD_Rec(a[i])^.file_column_order:=-1;
pZD_Rec(a[i])^.table_name:=ADOQuery1.fieldbyname('表名').AsString;
inc(i);
next;
end;
这个函数结束的时候,我也
for j:=0 to column_count-1 do
begin
if a[j]<> nil then
Dispose(a[j]);
end;但是我看Dispose没有用啊,比如:我再for j:=0 to column_count-1 do设了个断点,dispose一个指针后,我看刚dispose的那个指针还是没有变成nil,还是有值,这怎么回事啊?有没有人知道,拜托了。
if a[j] <> nil then begin
Dispose(a[j]);
a[j] := nil;
end;
new(a) 分配的是它指向区域的地址
dispose(a)释放的也是 指向区域的地址自身的地址依然存在只是你不能引用它指向的区域了否则会出错。
a:=nil是将自身的地址置空
to:unsigned
你说“Dispose只是释放内存的引用,而不会对内存做修改”。那如果我只用了Dispose,而没有 a[j] := nil; 那长时间一直这样开着这个程序,也一直再运行的话,会不会就因为这个内存会变得很大?
删除文件也只是做删除标记,文件的内容还是存在磁盘上,那会不会电脑用久了,就没空间存放文件了呢,显然不是.
for j:=0 to column_count-1 do
begin
// if a[j] <> nil then
Dispose(a[j]);
end;
应该可以吧?
局部变量 a:array of pZD_Rec;
而且SetLength(a,column_count);
和
While not eof do
begin
a1:=ADOQuery1.fieldbyname('列名').AsString;
New(a[i]);
pZD_Rec(a[i])^.file_column:=a1;
pZD_Rec(a[i])^.file_column_order:=-1;
pZD_Rec(a[i])^.table_name:=ADOQuery1.fieldbyname('表名').AsString;
inc(i);
next;
end;
都是再这个子函数里运行的,
再这个子函数运行的最后加的
for j:=0 to column_count-1 do
begin
if a[j] <> nil then
Dispose(a[j]);
end; 所以每次进这个子函数的时候,a都是一个新的吧?
--------------------------------------------------
问题2:以前再子函数里用的是a:array of TZD_Rec; 而不是指针数组。网上很多地方说,如果把结构体放到数组里的话,会很占内存的,建议用指针,所以我才改成指针的,不知道指针的效果是不是好些?
a:pZD_Rec;
这是一个指针,如果你想要分配N个结构,那就用GetMem之类的分配N个结构的大小即可.一次性分配内存远比分多次分配内存消耗更小.