Delphi 3内存分配问题

时间:2011-03-05 12:46:35

标签: delphi memory-management linked-list

我一定很容易错过一些东西?我正在尝试在Delphi 3应用程序中创建链接列表。

这是通过两个类 ItemList Item 实现的。 ItemList 在表单创建时实例化。它持续到形式的生命。每个 Item 对象都会根据需要进行实例化。表单有一个名为 AddAcc 的函数。 AddAcc 是通过其中一个表单控件的on-change事件调用的。

在此次变更事件中会发生什么:

  1. AddAcc 被称为
  2. AddAcc 创建新的对象
  3. AccAdd 调用 ItemList.AddItem 并通过引用传递
  4. AddItem Item 对象放在列表的尾部
  5. 我已经测试了 AddItem 并且效果很好。我的问题是每次调用* AddAcc *它都会获得相同的内存位置。我尝试了不同的方法来创建一个新的 Item 对象。我使用了New,GetMem(w / FillChar),并实例化了Item类型的局部变量。对 AddAcc 的所有调用都会导致获得相同的内存位置。

    我已将 Item 对象直接(通过引用)传递给 AddItem ,并且还传递了指向 Item 对象的指针。

    我认为链接列表中 Item 对象实例的引用(指针)将确保维护Item的内存位置。但是,一旦 AddAcc 类退出,它就会被收集。

    FUNCTION AddAcc;
    
    Var
    
         accItem : ptrItem;
    
    BEGIN
    
        GetMem(accItem, sizeOf(Item));
    
        FillChar(accItem^, sizeof(Item), 0);
    
        ItemList.AddItem(accItem^);
    
    End;
    
    
    
    Procedure TItemList.AddItem(Var newItem : TAccessoryItem);
    
    begin
       Inc(_count);
    
       // add first item to the list            
        If (_count = 1) Then 
        begin       
    
              _fifoHead := @newItem;
              _tail := @newItem;
              newItem.Next   := @_tail;
              newItem.Previous := @_fifoHead;
              exit;
    
        end;
    
         _tail^.Next := @newItem;  
         newItem.Previous := _tail^;
         mewItem.Next := @_tail;
         _tail := @newItem;         
    end;
    

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

以下是我编写链表的方法:

type
  PItem = ^TItem;
  TItem = record
    Next: PItem;
    Data: Integer;
  end;

procedure Add(var First: PItem; Data: Integer);
var
  NewItem: PItem;
begin
  New(NewItem);
  NewItem.Next := First;
  NewItem.Data := Data;
  First := NewItem;
end;

...

var
  First: PItem;
begin
  First := nil;
  Add(First, 42);
  //etc.
end;

当您需要取消分配列表时,请执行以下操作:

var
  Item: PItem;
begin
  while Assigned(First) do begin
    Item := First;
    First := Item.Next;
    Dispose(Item);
  end;
end;

我相信这是在Pascal中编写链表类型代码的规范方式。

我故意为可以想象的这个最简单的链表编写这段代码。这使您可以专注于分配,使用指针等。您似乎已经知道如何在更复杂的列表中维护引用,因此我相信您可以轻松地根据您的需要调整这种代码。