zoukankan      html  css  js  c++  java
  • system单元的几个内存处理方法

    system单元几个内存处理方法

    1.Move - 移动内存块
    var
      Source,Dest: string;
    begin
      Source := '123456789';
      Dest   := '---------';
      Move(Source[5], Dest[3], 4);
      ShowMessage(Dest); {--5678---}
    end;

    2.System.New、System.Dispose - 为某个指针申请和释放内存
    Type
      TMyRec = record     {定义结构}
        name: string[8];
        age : Word;
      end;
      PMyRec = ^TMyRec;   {定义结构指针; Delphi 一般把它定义在结构前面, 都可以}

    如果直接使用结构, 不使用指针}
    procedure TForm1.Button1Click(Sender: TObject);
    var
      r: TMyRec;
    begin
      r.name := '张三';
      r.age := 99;
      ShowMessage(Format('%s %d 岁', [r.name, r.age])); {张三 99 岁}
    end;

    {如果使用结构指针}
    procedure TForm1.Button2Click(Sender: TObject);
    var
      pr: PMyRec;
    begin
      New(pr);            {分配内存}
      pr^.name := '张三';
      pr^.age := 99;
      ShowMessage(Format('%s %d 岁', [pr^.name, pr^.age])); {张三 99 岁}
      Dispose(pr);        {释放内存}
    end;

    {Delphi 允许使用结构时做如下简化}
    procedure TForm1.Button3Click(Sender: TObject);
    var
      pr: PMyRec;
    begin
      New(pr);
      pr.name := '张三';
      pr.age := 99;
      ShowMessage(Format('%s %d 岁', [pr.name, pr.age])); {张三 99 岁}
      Dispose(pr);
    end;

    3.System.GetMem、System.FreeMem - 申请和释放内存
    如果只为单个指针分配内存, 和 New 和 Dispose 是一样的; 与之不同的是: GetMem 可以申请连续的多个内存块.

    Type
      TMyRec = record     {定义结构}
        name: string[8];
        age : Word;
      end;
      PMyRec = ^TMyRec;   {定义结构指针}

    var
      pr: PMyRec;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      {同时分配 3 个结构的内存; 此时的三个结构在内存中是连续的}
      GetMem(pr, SizeOf(TMyRec) * 3);

      {此时 pr 指向第一个结构, 赋值}
      pr.name := '张三';
      pr.age := 11;

      {让 pr 指向第二个结构, 赋值}
      Inc(pr);
      pr.name := '李四';
      pr.age := 22;

      {让 pr 指向第三个结构, 赋值}
      Inc(pr);
      pr.name := '王五';
      pr.age := 33;

      {先回到第一个结构, 然后依次读取}
      Dec(pr, 2);
      ShowMessage(Format('%s %d 岁', [pr.name, pr.age])); {张三 11 岁}
      Inc(pr);
      ShowMessage(Format('%s %d 岁', [pr.name, pr.age])); {李四 22 岁}
      Inc(pr);
      ShowMessage(Format('%s %d 岁', [pr.name, pr.age])); {王五 33 岁}

      {从第一个结构, 清除 3 个结构大小的内存, 这样就删除了上面三个结构}
      Dec(pr, 2);
      FreeMem(pr, SizeOf(pr^) * 3); {SizeOf(TMyRec)  和 SizeOf(pr^) 是一样的}
    end;

    4.System.ReallocMem - 重新申请内存
    Type
      TMyRec = record     {定义结构; 记住该结构的大小是 12 个字节}
        name: string[8];
        age : Word;       {虽然 Word 是 2 字节大小; 但因按 4 字节对齐, 它占用 4 字节}
      end;
      PMyRec = ^TMyRec;   {定义结构指针}

    var
      pr: PMyRec;

    procedure TForm1.FormCreate(Sender: TObject);
    const
      str = '地址: %d; 姓名: %s';
    begin
      {申请 3 个 TMyRec 结构大小的内存}
      //GetMem(pr, SizeOf(TMyRec) * 3);
      ReallocMem(pr, SizeOf(TMyRec) * 3); {这一句也可以用上一行代替}

      {赋值}
      pr.name := '张三';
      pr.age := 11;

      Inc(pr);
      pr.name := '李四';
      pr.age := 22;

      Inc(pr);
      pr.name := '王五';
      pr.age := 33;

      {显示三个结构的地址与信息; 地址应该是连续的(相间 12 字节)}
      Dec(pr, 2);
      ShowMessage(Format(str, [Integer(pr), pr.name])); {地址: 15278504; 姓名: 张三}
      Inc(pr);
      ShowMessage(Format(str, [Integer(pr), pr.name])); {地址: 15278516; 姓名: 李四}
      Inc(pr);
      ShowMessage(Format(str, [Integer(pr), pr.name])); {地址: 15278528; 姓名: 王五}

      {重新申请内存, 要 5 个结构大小, 并给 2 个新的结构赋值}
      Dec(pr, 2);
      ReallocMem(pr, SizeOf(TMyRec) * 5);

      Inc(pr, 3);
      pr.name := '马六';
      pr.age := 44;

      Inc(pr);
      pr.name := '孙七';
      pr.age := 55;

      {显示相关信息; 会发现地址虽然还是连续的, 但已经和上面不同!}
      Dec(pr, 4);
      ShowMessage(Format(str, [Integer(pr), pr.name])); {地址: 14875920; 姓名: 张三}
      Inc(pr);
      ShowMessage(Format(str, [Integer(pr), pr.name])); {地址: 14875932; 姓名: 李四}
      Inc(pr);
      ShowMessage(Format(str, [Integer(pr), pr.name])); {地址: 14875944; 姓名: 王五}
      Inc(pr);
      ShowMessage(Format(str, [Integer(pr), pr.name])); {地址: 14875956; 姓名: 马六}
      Inc(pr);
      ShowMessage(Format(str, [Integer(pr), pr.name])); {地址: 14875968; 姓名: 孙七}

      Dec(pr, 4);
      FreeMem(pr, SizeOf(TMyRec) * 5); {也可以用 FreeMem 清理 ReallocMem 申请的内存}
    end;

  • 相关阅读:
    UIView与CALayer的区别,很详细
    iOS开发之启动动画(动态欢迎界面,非静态Default)
    js前端验证时间大小
    C#联通新版验证码识别的实现
    C#打印100以内质数
    SQL竖表转横表 / 横表转竖表
    不用中间变量交换两个变量的值
    单例模式
    C#递归遍历指定目录下文件和文件夹
    冒泡排序
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2940877.html
Copyright © 2011-2022 走看看