procedure TForm1.Button1Click(Sender: TObject);
var
A1,A2: array of integer;
begin
SetLength(A1,4);
A2:=A1;
A1[0] := 1;
A2[0] :=26;
edit1.Text := IntToStr(A1[0]);
end;
请大家告诉为,为什么A1的值为26呀.我并没有为A2分配内存.而且.A2应该等于A1的值呀.真是搞不明白.
var
A1,A2: array of integer;
begin
SetLength(A1,4);
A2:=A1;
A1[0] := 1;
A2[0] :=26;
edit1.Text := IntToStr(A1[0]);
end;
请大家告诉为,为什么A1的值为26呀.我并没有为A2分配内存.而且.A2应该等于A1的值呀.真是搞不明白.
解决方案 »
- DLL窗体之间发消息问题
- 使用application.create创建登录窗口老是编译不通过
- delphi里 WinExec('calc',SW_SHOWDEFAULT);啥意思
- Delphi窗体切换问题
- 发1分贴赚30可用分^_^
- ToAscii这个函数该如何用
- 一个插入问题!!!
- 谁有关于ocr或者omr方面的算法、原理介绍以及相关资料?(高分)
- 关于 TdxDBGrid 组件的问题。让在dxDBGrid1显示的纪录中符合条件的纪录以自己指定的字体颜色来显示。**一个实力分水岭的问题,数风流人物
- Delphi的延时函数是什么??????(在线)
- 急!装上TdbGrideh控件,现在TQuery控件bde连不上了????
- ADOQuery:CommandText does not return a result set!什么错误??急!
var
stringList1, stringList2 : TStringList;
...
begin
stringList1 := TStringList.Create;
stringList2 := TStringList.Create;
stringList2 := TStringList1;
{后面是一些操作}
stringList1.Free;
stringList2.Free;
end;
写完后,可能自己觉得比较满意,心想我可是严格按照书上来的,哪想到出现了“内存泄露”。
stringList1 := TStringList.Create;
上面这句为stringList1分配了一块内存区域;
stringList2 := TStringList.Create;
上面这句实际上为stringList2又分配了一块内存区域;
stringList2 := TStringList1;
上面这句将stringList2指向与stringList1相同的一块内存区域,而刚才为其分配的内存区域成为一块没有引用又不能被分配出的内存区域,出现泄露的情况。
上面的问题如果你明白了以后,你的问题自然也就解决了,明确了。
====可是我这个是动态数组呀,还没有分配内存,可以这样用吗?=====这是楼主的原话,实际上你要明白,书上并没有把话讲清楚,而你要明白,即:
如果现在没有一块被分配好了的内存区域,你必须用SetLength获得一块有用的内存,而如果已经有了这样的内存后,你可以使用“:=”的方法,将它供多个对象进行使用。所以,书上说的“复杂对象必须用create创建,free释放”并不清晰,他的前提是目前还没有一块这样的内存区域。
当然,如果你本身就要创建多块单独的内存区域,那就必须:
var
A1,A2: array of integer;
begin
SetLength(A1,4);
SetLength(A2,4);
...
如果你需要共享一块内存区域,你就:
var
A1,A2: array of integer;
begin
SetLength(A1,4);
A2 := A1;
...
这样才是正确的并且防止了内存泄露的情况。