zoukankan      html  css  js  c++  java
  • Delphi 使用字符串时,一个注意地方

    技术交流,DH讲解.

    一句话,结构体里面,避免使用String,要使用Array[N..M] of char,或者String[N].
    肯定有兄弟要问,为什么,其实最先我也不知道,因为我觉得用string也没有错的.
    看例子:

      THuangJacky = record
        Age:Integer;
        FName:string;
      end;
    
    procedure TForm3.btn1Click(Sender: TObject);
    var
      A:THuangJacky;
    begin
      A.FName:='HuangJacky';
      A.Age:=23;
      ShowMessage(A.FName);
    end;

    没有错误,难道我危言耸听了.....
    其实这个时候因为结构体的内存管理是有编译器来管理,所以没有问题,但是如果我们是在列表中添加记录体指针呢?

      THuangJacky = record
        Age:Integer;
        FName:string;
      end;
      PHuangJacky = ^THuangJacky;
    
    procedure TForm3.btn1Click(Sender: TObject);
    var
      A:PHuangJacky;
      L:TList;
    begin
      //先申请空间
      New(A);
      //结构体指针可以省略后面这个^
      A^.Age:=23;
      A.FName:='HuangJacky';
      L:=TList.Create;
      try
        L.Add(A);
        ShowMessage(PHuangJacky(L[0])^.FName);
      finally
        //清除使用的内存.
        FreeMem(L[0]);
        L.Clear;
        L.Free;
      end;
    end;

    运行没有问题啦,哈哈,可是在关闭程序的时候,如果开了内存泄漏或者用了其他工具就能报出有内存泄漏,
    Memory Leak: Total size=34 - Count=1.泄漏位置A.FName:='HuangJacky';
    思前想后,我觉得还是改成:

      THuangJacky = record
        Age:Integer;
        FName:string[23];//凑4的倍数,那为什么要23个呢?请看字符串 详解
      end;
      PHuangJacky = ^THuangJacky;
    

    这样果然不会内存泄漏了.
    后来和肥鸟兄讨论下,他提出一个不用改String的方法:

    procedure TForm3.btn1Click(Sender: TObject);
    var
      A:PHuangJacky;
      L:TList;
    begin
      //先申请空间
      New(A);
      try
      //只要对内存进行了读写,最好用tryf来保证不泄露
      //结构体指针可以省略后面这个^
        A^.Age:=23;
        A.FName:='HuangJacky';
        L:=TList.Create;
        L.Add(A);
        ShowMessage(PHuangJacky(L[0])^.FName);
      finally
        //清除使用的内存.
        A:=PHuangJacky(L[0]);
        //new 和 dispose是配对使用的,GetMem和FreeMem配对使用
        //new() = GetMem() + Initialize()
        Dispose(A);
        L.Clear;
        L.Free;
      end;
    end;


    也不会内存泄漏了.肥鸟兄是用Delphi写服务器程序,所以对这些都了解得清楚些.不错.又学习了一把.

    严谨.
    明白了吧,我DH是不会忽悠人的.
    Have Fun.

  • 相关阅读:
    web三大组件的注册
    springboot 支持 jsp
    redis 储存session
    springboot 做切面
    springboot web静态资源访问
    springboot加载外部配置文件
    springboot 两种配置文件,application.properties ,application.yml ,注入值的两种方式,主动@ConfigurationProperties与被动@value,和其他注解Conditional,PropertySource
    今日立春,SpringBoot! 简单springboot项目搭建开始。
    linux防火墙开放端口
    Don’t try to create file system on an “extended” partition
  • 原文地址:https://www.cnblogs.com/huangjacky/p/1621632.html
Copyright © 2011-2022 走看看