今天遇到一个问题,我用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]);