标签: getmem

在记录类型之间分配字符串时Delphi访问冲突错误

我有一个简单的记录类型.我分配了此记录的新实例,并使用过程("_ clone")将值从现有记录复制到新记录.我只在分配字符串值时才获得访问冲突.

有任何想法吗?非常感谢帮助.


TYPE定义:

TPointer = ^TAccessoryItem;
TAccessoryItem = Record
  Id : Integer;
  PartNumber : String;
  Qty : Integer;
  Description : String;
  Previous : Pointer;
  Next : Pointer;
end;
Run Code Online (Sandbox Code Playgroud)
Procedure TAccessoryList._clone (Var copy : TAccessoryItem; Var original : TAccessoryItem);

 begin

    copy.Id := original.Id;
    copy.Qty := original.Qty;
    copy.Partnumber := original.Partnumber;  **// Access errors happens here**
    copy.Next := Nil;
    copy.Previous := Nil;

  end;
Run Code Online (Sandbox Code Playgroud)

致电以下申请:

  procedure TAccessoryList.AddItem(Var Item : TAccessoryItem);

 Var

    newItem : ptrAccessoryItem;

 begin

    GetMem(newItem, sizeOf(TAccessoryItem));

    _clone(newItem^, Item);

 end;
Run Code Online (Sandbox Code Playgroud)

delphi pointers access-violation data-structures getmem

5
推荐指数
1
解决办法
3435
查看次数

用于高容量记录器应用程序的分配方法是什么?

我正在使用Delphi开发一个记录器/嗅探器.在操作期间,我得到了大量的数据,这些数据可以在压力操作期间累积到大约3 GB的数据.在某些计算机上,当我们到达这些级别时,应用程序停止运行,有时会抛出异常.

目前我正在使用GetMem函数来分配指向每条消息的指针.

是否有更好的方法来分配内存,以便最大限度地减少失败的可能性?请记住,我不能将大小限制为硬限制.

您如何看待使用HeapAlloc,VirtualAlloc甚至是映射文件?哪个更好?

谢谢.

delphi memory-management heap-memory high-volume getmem

5
推荐指数
1
解决办法
207
查看次数

为什么我使用Mike Heydon的TStringBuilder类来获取访问冲突?

我正在使用从.Net移植到Delphi 7 的TStringBuilder类.

这是我的代码片段:

procedure TForm1.btn1Click(Sender: TObject);
const
  FILE_NAME = 'PATH TO A TEXT FILE';
var
  sBuilder: TStringBuilder;
  I: Integer;
  fil: TStringList;
  sResult: string;
  randInt: Integer;
begin
  randomize;
  sResult := '';
  for I := 1 to 100 do
  begin
    fil := TStringList.Create;
    try
      fil.LoadFromFile(FILE_NAME);

      randInt := Random(1024);

      sBuilder := TStringBuilder.Create(randInt);
      try
        sBuilder.Append(fil.Text);
        sResult := sBuilder.AsString;
      finally
        sBuilder.free;
      end;

      mmo1.Text := sResult;
    finally
      FreeAndNil(fil);
    end;
  end;
  showmessage ('DOne');
end;
Run Code Online (Sandbox Code Playgroud)

我遇到了AV错误.当我创建大小倍数为1024的内存时,我可以缓解这个问题,但有时它仍然会发生.

难道我做错了什么?

delphi stringbuilder getmem

4
推荐指数
1
解决办法
384
查看次数