这段程序是否造成内存丢失?(50分)

  • 主题发起人 主题发起人 xingsx
  • 开始时间 开始时间
X

xingsx

Unregistered / Unconfirmed
GUEST, unregistred user!
var
Buffer:array[1..BUFFER_LENGTH] of String

Count: longint


procedure Append(str:string)

begin
if count=BUFFER_LENGTH then
begin
Pointer(Buffer[1]):=nil
//<-Buffer[1]占用的空间是否被自动释放?
move(Buffer[2],Buffer[1],Sizeof(String)*(count-1))

Pointer(Buffer[count]):=nil

Buffer[count]:=str

end else begin
inc(count)

Buffer[count]:=str

end

end;

如果不能被释放,该如何释放?
 
Pointer(Buffer[1]):=nil

修改成为:Buffer[1]:='';
这样可以释放掉或者将其引用计数减一。

Pointer(Buffer[count]):=nil
是正确的。
 
用Finalize(Buffer[1])是否和buffer[1]:=''等效?
Finalize的作用是什么?

我用move将buffer[count]复制到buffer[count-1]后,buffer[count]的所
指向的内存string引用计数是否自动加一?(注意:我用的是move)

在Pointer(buffer[count]):=nil时,是否会使string被释放,导致
buffer[count-1]指针失效?

new(p);
new(p);//第一个New分配的空间是否自动被释放?
dispose(p);
 
Finalize在这里和buffer[1]:=''等效,finalize可以应付几乎所有的内存自管理
变量。例如,假如buffer是一个动态数据,那么他就等同于:=nil或者setlength 0。

Move 也好 Pointer(buffer[count]):=nil也罢,都不会修改引用计数
修改引用计数必需是显式STRING类型的情况下才会发生

因此,在Pointer(buffer[count]):=nil时,不会使string被释放,因此也不会导致
buffer[count-1]指针失效


new(p)并不会判定p的原始指针并自动调用dispose释放,
因此必需在第二个new前加上dispose(p)
 
后退
顶部