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的值呀.真是搞不明白.

解决方案 »

  1.   

    数组来回传递的是地址,你把A1的地址给了A2,对A2操作,就反应到了A1上!
      

  2.   

    你把a1的首地址和a2的首地址相同了,建议看看C/C++的指针
      

  3.   

    楼主的问题反映了楼主的一个误区。有人在读到书上说“复杂对象必须用create创建,free释放”这样的语句后,总喜欢在程序中这样写:
    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;
     ...
    这样才是正确的并且防止了内存泄露的情况。
      

  4.   

    你把动态数组A2 := 动态数组A1这句代码的意思就是把A2这个变量指向A1在内存中的地址,那么很明显,后面所有对A2的操作其实都会影响到A1,并且如果你释放变量A1后再释放A2(假设A2和A1都是对象,那么结果就是发生非法指针访问)