当程序结束时,那些资源需要编写代码进行释放(50分)

  • 主题发起人 主题发起人 clion
  • 开始时间 开始时间
To茶叶蛋:
GDI的对象在某些情况下是可以自动释放的,但并不是所有情况下.
具体要什么情况不释放,我也不清除.总之,如果您大量使用GDI资源后
不释放,多运行几遍程序后,系统资源就会明显下降.即使是NT也不例
外.而内核管理的Win32对象则要好得多.
这种情况也是有其根源的.每个Win32对象的作用范围仅限于一个
进程.如果两个进程共享某个资源,其句柄在两个进程中是不一样的.而
GDI/USER对象则不同.如果进程甲创建了一个HBITMAP,那么这个句柄
可以在进程乙中使用.窗口句柄也是一样的.这样的实现方案是因为M$所
谓的C/S结构造成的.完成全部GDI/USER操作需要几个以Service方式
运行的进程合作.而这些对象从本质上来说是这些进程的局部资源.这样
就没有必要为每个进程映射不同的句柄,且还会提高效率.但这样的结果
导致跟踪句柄引用的困难.例如,一个窗口句柄HWND,在创建它的进程释
放它以后,应该从系统中删除.但某些情况下,管理它的USER进程却不知
道GDI进程是否还要引用这个句柄(对USER来说,GDI和用户进程没有差别).
这就导致了资源泄漏.

BTW:我的观点是,不管系统如何确保可以释放多少资源,也不管您能够多么肯
定某个资源只分配很少的几次,释放资源总是程序员的责任.系统的行为只是
保证程序崩溃时不会导致系统资源耗尽.
 
to tea:
> to tqz:
> >Tea Agg:不对不对,free之后对象指针之值不确定,不会自动变为nil,
> >除非你在释放后手工赋值为nil。
> Use Free to destroy an object. Free automatically calls the Destroy if the
> object instance is is not nil. Any object instantiated by a call to Create
> should be destroyed by a call to Free, so that the object an be properly
> destroyed and the memory released. Free is successful even if the object
> is nil, so if the object was never initialized, for example, calling Free
> won抰 result in an error.
> 以上是Delphi帮助的原文.
tqz指的是一个对对象引用的指针,如 PObject = ^ Tobject,
Pobject^.free以后,Pobject的值是不确定的。你引的这段话没有什么关系啊。
 
1.声明:我在此出的所有发言均是针对VCL对象.(指针肯定要自己free掉的)
2.lhz写的真好,如果一定要给我加分的话,lhz的得分应当比我高.
 
1.VCL对象总是对应系统的某个资源,如String对应一片MEM,
Bitmap主要对应一个HBITMAP,等等.由于VCL考虑到了资源
分配/释放的问题,所以VCL对象在常规使用方式下一般都有
自己释放的功能.但这对其作为资源的本质没有影响.
2.过奖过奖 //haha :)
 
To Butterfly:
TObject 本身就是一个指针
To Tea Agg:
你引的原文跟我的话没有关系,他只是说Free方法不管Object是否为Nil,但是没有说
Free之后会不会变为nil,事实上不会。
To lhz:一般VCL对象都会释放自己占用的资源,问题是谁来释放这些VCL对象。从TCompoent继承就可以由Owner释放,否则一般要手工释放。
To VC:Good work!
 
To tqz:
其实对象是可以自己释放自己的.不如TThread,就可以自己释放的.
关键是要确定自己是由new生成的,并且没有别的对象要删除自己就
可以了.VCL的对象都只能由new产生,所以其Free方法一般包含对
delete的调用.故VCL对象的自动释放与Owner并无直接联系,只是
Owner调用了其Free函数而已.

BTW:对象自己删除自己的方法:

void TObject::Free()
{
//....
delete (void*)this;
}
 
to lhz:
>delete的调用.故VCL对象的自动释放与Owner并无直接联系,只是Owner调用了其
>Free函数而已.
我所讨论的就是由谁来调用TObject.Free,TComponent 不用操心,TObject就要
编程来Free.
总之,自己New的东东自己Free才是好风格。
 
to lhz:
>VCL对象总是对应系统的某个资源,如String对应一片MEM, Bitmap主
>要对应一个HBITMAP,等等.由于VCL考虑到了资源
> 分配/释放的问题,所以VCL对象在常规使用方式下一般都有 自己释
>放的功能.但这对其作为资源的本质没有影响.

首先String是一个比较特殊的东东,Delphi对其作了特殊处理,它

所占用的内存资源虽然是动态分配的,但程序员完全不用关心其释放与分

配,这使得大家在用String是感到非常方便。

不过象TBitmap,TPicture等着一类对象却应该由程序员自己来管理

其对象的申请和释放,必要时还需加上处理异常的机制,不应该指望Delphi

或Windows来帮你做资源释放工作。我通常的做法是写完申请的代码,马上

写释放的代码,然后再使用....

还有前面提到的TThread,它的确可以自己释放自己,源码如下:
function ThreadProc(Thread: TThread): Integer;
var
FreeThread: Boolean;
begin
Thread.Execute;
FreeThread := Thread.FFreeOnTerminate;
Result := Thread.FReturnValue;
Thread.FFinished := True;
Thread.DoTerminate;
if FreeThread then Thread.Free;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
EndThread(Result);
end;

但这是由于Thread的特殊性决定的,它提供的是一种并发的机制,

Delphi才会有这种设计,但对于其他一些对象就没有这个必要了....

总之,一个不好的程序风格并不是不可以写程序,一些写商业软件的

的程序员的程序风格也可能很糟糕,其结果就是写出的程序错误百出,或

消耗大量的资源,要想提高自己的编程能力,养成一个好的程序风格非常

重要.....
 
to lhz:
>VCL对象总是对应系统的某个资源,如String对应一片MEM, Bitmap主
>要对应一个HBITMAP,等等.由于VCL考虑到了资源
> 分配/释放的问题,所以VCL对象在常规使用方式下一般都有 自己释
>放的功能.但这对其作为资源的本质没有影响.

首先String是一个比较特殊的东东,Delphi对其作了特殊处理,它

所占用的内存资源虽然是动态分配的,但程序员完全不用关心其释放与分

配,这使得大家在用String是感到非常方便。

不过象TBitmap,TPicture等着一类对象却应该由程序员自己来管理

其对象的申请和释放,必要时还需加上处理异常的机制,不应该指望Delphi

或Windows来帮你做资源释放工作。我通常的做法是写完申请的代码,马上

写释放的代码,然后再使用....

还有前面提到的TThread,它的确可以自己释放自己,源码如下:
function ThreadProc(Thread: TThread): Integer;
var
FreeThread: Boolean;
begin
Thread.Execute;
FreeThread := Thread.FFreeOnTerminate;
Result := Thread.FReturnValue;
Thread.FFinished := True;
Thread.DoTerminate;
if FreeThread then Thread.Free;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
EndThread(Result);
end;

但这是由于Thread的特殊性决定的,它提供的是一种并发的机制,

Delphi才会有这种设计,但对于其他一些对象就没有这个必要了....

总之,一个不好的程序风格并不是不可以写程序,一些写商业软件的

的程序员的程序风格也可能很糟糕,其结果就是写出的程序错误百出,或

消耗大量的资源,要想提高自己的编程能力,养成一个好的程序风格非常

重要.....
 
To 3h:

the Data member data must be disposed by yourself. Its' type is
pointer, not TObject, Delphi and Windows can not know the memory
size of the block the Data member data pointed. Why do you imagine
system will dispose it automaticly? That member data is create by
yourself, not by the system!
 
接受答案了.
 
后退
顶部