首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi 3内存分配问题

Delphi 3内存分配问题
EN

Stack Overflow用户
提问于 2011-03-05 12:46:35
回答 1查看 275关注 0票数 4

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

这是通过两个类ItemList和Item实现的。ItemList在表单创建时被实例化。它在形态的生命中持续存在。根据需要实例化每个Item对象。表单有一个名为AddAcc的函数。AddAcc是通过窗体控件之一的on-change事件调用的。

在此更改事件期间发生了什么:

  1. AddAcc称为
  2. AddAcc,创建一个新的项目对象
  3. AccAdd调用ItemList.AddItem并通过引用传递条目
  4. AddItem将项目对象放置在列表

的尾部

我已经测试过AddItem,它运行得很好。我的问题是,每次调用*AddAcc*时,它都获得相同的内存位置。我尝试过不同的方法来创建一个新的Item对象。我使用了New,GetMem (w/ FillChar),并实例化了一个类型为Item的局部变量。所有对AddAcc的调用都会导致获得相同的内存位置。

我直接(通过引用)将Item对象传递给AddItem,或者传递指向Item对象的指针。

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

代码语言:javascript
复制
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;

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-05 13:51:05

下面是我如何写一个链接列表:

代码语言:javascript
复制
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;

当您需要释放您的列表时,您可以这样做:

代码语言:javascript
复制
var
  Item: PItem;
begin
  while Assigned(First) do begin
    Item := First;
    First := Item.Next;
    Dispose(Item);
  end;
end;

我相信这是在Pascal中编写链接列表类型代码的典型方法。

我有意为这个最简单的链接列表编写了这段代码。这使您能够集中精力于指针的分配、使用等等。您似乎已经知道如何维护更复杂的列表中的引用,因此我相信您将毫不费力地使这种风格的代码适应您的需要。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5203899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档