SetLength设置动态数组长度的问题
问题是后面重新分配的时候是在原来的基础上新增呢还是所有内存重新分配
如果是后者,那么重新分配后,前面的元素的内存是不是不确定的呢?从而导致前面的元素数据错乱了
------解决方案--------------------
如果后面有足够空间,会接着分配,如果空间不够,会重新开辟一块区域
------解决方案--------------------
SetLength好比Realloc,如果空间变大,会复制前面的的内容,如果空间变小,删除后面的内容。
但是前面内容的指针就不能确定了
如:
var
piList : array of integer;
P : PInteger;
begin
SetLength(piList , 1);
P := @piList[0];
P^ := 0; //这个指针没问题
SetLength(piList , 100);
P^ := 0; //这个指针就不确定,需要重新给指针赋值
------解决方案--------------------
增加是重新分配, 前面的内容会移动新的空间里面,所以地址会变的; 变小不会
-
Delphi(Pascal) code
begin SetLength(X, 1); …… SetLength(X, 2); …… SetLength(X, 3); end;
问题是后面重新分配的时候是在原来的基础上新增呢还是所有内存重新分配
如果是后者,那么重新分配后,前面的元素的内存是不是不确定的呢?从而导致前面的元素数据错乱了
------解决方案--------------------
如果后面有足够空间,会接着分配,如果空间不够,会重新开辟一块区域
------解决方案--------------------
SetLength好比Realloc,如果空间变大,会复制前面的的内容,如果空间变小,删除后面的内容。
但是前面内容的指针就不能确定了
如:
var
piList : array of integer;
P : PInteger;
begin
SetLength(piList , 1);
P := @piList[0];
P^ := 0; //这个指针没问题
SetLength(piList , 100);
P^ := 0; //这个指针就不确定,需要重新给指针赋值
------解决方案--------------------
增加是重新分配, 前面的内容会移动新的空间里面,所以地址会变的; 变小不会