Delphi 创建TObject对象需要释放吗?
TListBox组件的那个AddObject函数,用于保存一个数字很方便,因为Object参数本来就是一个指针,说白了本来就是数字,所以AddObject('字符',TObject(12)),以后,需要取出数字直接Integer(Objects[...])即可,不必去释放所谓的Object对象,因为根本没对象创建。但是我要保存一个record记录就麻烦了,所以考录到了TObject对象,下面是一些方法:
(1)、保存record的指针,发现record不做全局变量会丢失数据
type
TRecord=record
a,b:Integer;
end;
var t:TRecord;
begin
t.a :=100;
t.b :=100;
ListBox1.Items.AddObject('测试',TObject(@t));//<--此处无法保存数据,因为变量t的指针是临时的。
(2)、使用TObject对象
type
TMyObject=class(TObject)
public
a,b:Integer;
end;
......
var obj:TMyObject;
begin
obj :=TMyObject.Create;
obj.a :=100;
obj.b :=100;
ListBox1.Items.AddObject('测试',obj);
end;
数据是保存了,但是突然纠结起来了,TMyObject对象需要释放吗?就好像TRecord记录是否需要释放一样模糊起来了,大家看Delphi的TObject的源代码,几乎没有一处做了任何实质性的工作,Create是空的,Destory是空的,那么TObject对象需要释放吗?
[解决办法]
TMyObj是要释放的
你的方法1中,可以定义一个结构指针,然后New
type
PRecord=^TRecord;
TRecord=record
a,b:Integer;
end;
var t:PRecord;
begin
new(t);
t.a :=100;
t.b :=100;
ListBox1.Items.AddObject('测试',TObject(@t));
不过,相应的,这个也要释放,需要dispose(xxxx);
[解决办法]
Tobject的构造函数和析构函数为什么定义中为何没有代码,有两方面原因:
1:
详见《inside vcl 深入VCL架构剖析》第二章的2-6节,具体在79页
2:
详见《inside vcl 深入VCL架构剖析》中的第三章的3-2节,具体在“place holder方法”段。
delphi的对象的实例都是在堆中申请内存创建的,堆中的对象的生命周期跟全局变量的生命周期一样,都是跟程序的生命周期一致的。只有在栈中申请的内存才会随清栈工作时自动回收。
重申,create的对象一定要free,free的工作可以自己做也可以委托其他对象做,但必须明确自定确实做了free。
[解决办法]
record 非TOBJECT,跟integer、single这些同属值类型。
而且似乎你有点混淆
var
pInt: ^integer
int: integer;
begin
int:= 100; // int 是值类型的100
getmem(pInt,4); // pInt 是指针,在堆中分配了4字节内存
freemem(pInt); // pInt需要手动释放,而int不需要,它在栈中创建,函数结束就自动清栈一并销毁
end;
[解决办法]
手动创建,手动释放。这是大多数编程的准则。