delphi SetLength是如何工作的?(100分)

  • 主题发起人 主题发起人 水来
  • 开始时间 开始时间

水来

Unregistered / Unconfirmed
GUEST, unregistred user!
定义一个动态数组,如:a:array of integer;<br>setlength(a,5);<br>请问如果这个时候setlength(a,3)或者setlength(a,10),setlength是如何处理的呢?
 
你测试一下
 
按照后面定义的处理吧。。
 
我测试过,可是我无法确定内存此时的情况是怎么样,是重新开辟了一块内存,还是在原来内存的基础上进行的,还有不知道直接这样用会不会有什么问题
 
应该不会有什么问题。还有就是:你为何要这样使用呢?初始时设定好了不就可以了吗?<br>如果你一定要多次使用它来设定,试试这样:<br>SetLength(a, 0);<br>SetLength(a, 10);<br>SetLength(a, 0);<br>SetLength(a, 5);<br>SetLength(a, 0);
 
呵呵,动态数组嘛,现在就是需要改变它的长度啊<br>我看了delphi中关于setlength的帮助,我的英语很poor,还请大家帮忙
 
你可以这样试试:<br>&nbsp; &nbsp; n := 1;<br>&nbsp; &nbsp; SetLength(NVTList, n);<br>&nbsp; &nbsp; NVTList[0] := 2;<br>&nbsp; &nbsp; &nbsp;Inc(n, 1);<br>&nbsp; &nbsp; SetLength(NVTList, n);
 
感谢szhcracker的回答,可是我现在就是想弄明白setlength是如何工作的,如果清除了其工作原理,知道了这样做确实没有问题,那我就可以放心的使用了
 
帮助中是这么说的,可是这段话我不太明白<br>For a long-string or dynamic-array variable, SetLength reallocates the string or array referenced by S to the given length. Existing characters in the string or elements in the array are preserved, but the content of newly allocated space is undefined. The one exception is when increasing the length of a dynamic array in which the elements are types that must be initialized (strings, Variants, Variant arrays, or records that contain such types). When S is a dynamic array of types that must be initialized, newly allocated space is set to 0 or nil
 
When S is a dynamic array of types that must be initialized, newly allocated space is set to 0 or nil<br>大意是:当S是一个动态数组时必须初始化,重新设定时要设定为0或nil
 
跟踪一下,看一下CPU么好了。
 
如果新的长度小于原有长度,则直接把多余的内存释放。<br>如果新的长度大于原有长度,分两种情况:<br>1.当前数组后有足够的连续内存用于分配,则把当前数组后的内存分配给数组。<br>2.若当前数组后面可分配的内存不够,则新开一块内存分配给该数组,并把该数组中原有的数据复制过来,并释放原有内存。<br><br>明白了吧!
 
多人接受答案了。
 
后退
顶部