delphi中TObjectList删除对象

本文介绍了Delphi中的字符串类型,包括ShortString、AnsiString和WideString。详细阐述了ShortString的内存分配和使用,强调了其长度限制。同时,提醒开发者在使用SizeOf函数时需要注意与不同字符串类型的兼容性问题。
摘要由CSDN通过智能技术生成
今天遇到一个问题,我用TObjectList删除对象后,总是存在内存泄露的情况,看网上的资料TObjectList删除对象后,会自动释放对象占用的内存空间,于是只能自己调试了。
在TObjectList删除对象前,将对象保存出来,TObjectList删除对象后,该对象依旧存在,由此可知,此时他并没有被自动释放掉。在TObjectList删除对象后,判断对象是否为空,如果不为空的话,手动释放对象,至此内存释放解决。 
type
  TMsgs = class
  private
    bh:String;
    content: String;
    no:String;
    counts:Integer;
  public
    constructor Create(const v_bh,v_content,v_no: String);
    destructor Destroy(); override;
  end;


  TMyObjectList<T:class>=class(TObjectList<T>)
  private
    maxpool:Integer;
  public
    constructor Create();
    destructor Destroy(); override;
  end;

procedure updateMessageList(mylist:TMyObjectList<TMsgs>);
var
  v_node:TMsgs;
  v_i:Integer;
begin
  for v_i := mylist.Count-1 downto 0 do
      v_node:= mylist.Items[v_i];
      mylist.Delete(v_i);
      if v_node<>nil then
      begin
        FreeAndNil(v_node);
      end;
  end;
end;

Delphi 中的字符串 :
一、Delphi 2009 之前的字符串(不支持 Unicode):
  Delphi 2009 之前的字符串分为 3 种:ShortString、AnsiString、WideString。
  【ShortString】
  ShortString 是一种比较古老的 Pascal 字符串格式,它最多只能容纳 255 个字节的字符。当我们声明一个 ShortString 类型的变量时,Delphi 会自动申请 256 个字节的内存空间给该变量,其中第一个字节用来存放字符串的长度,后面的 255 个字节用来存放字符串内容,如果字符串的长度不够 255 个字节,则有多少字符就用多少内存,后面未用到的内存清零。
  

var
  SStr: ShortString;
上面的声明就使 SStr 拥有了 256 个字节的内存空间:Sizeof(SStr); { = 256; }
直到 SStr 不再被使用时,Delphi 会自动释放 SStr 所占用的内存空间。
var
  SStr: string[16];

  这样,我们就声明了一个只能容纳 16 个字节内容的 ShortString 字符串,加上一个字节用来存放字符串的长度,SStr 一共占用 17 个字节的内存空间:Sizeof(SStr); { = 17; }

var
  SStr: string[16];
begin
  SStr := 'ABC';
{ 此时:
  Ord(SStr[0]);  // = 3   字符串长度为 3
  SStr[1];       // = 'A' 第一个字符为 A
  SStr[2];       // = 'B' 第二个字符为 B
  SStr[3];       // = 'C' 第三个字符为 C
  SStr[4];       // = #0  其余位置清零 #0
  ……           //       其余位置清零 #0
  SStr[255];     // = #0  其余位置清零 #0
  High(SStr);    // = 16  上限位置为 16
  Low(SStr);     // = 0   下限位置为 0 }
end;
接下来,我们来看看 SStr 的指针情况。
{ 在一个空白窗体上放置一个 TMemo 和一个 TButton }
procedure TForm1.Button1Click(Sender: TObject);
var
  SStr: ShortString;

  pS: Pointer;
  pS1: Pointer;
begin
  SStr := 'ABC';

  pS := Addr(SStr);        { 字符串变量 SStr 的地址 }
  pS1 := Addr(SStr[0]);    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值