◆过程中声明了类类型的局部变量,并且创建了他的实例,过程结束后这个变量会怎样?
------------------------------
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  Form3: TForm1;
begin
  Form3 := Tform1.Create(Self);
  Form3.Show;
end;end.
------------------------------
局部变量放在栈中,在过程结束后有可能被其它数据覆盖掉。
我想问的是:
1:这个Form3是在栈中建立的还是在堆中?2:在过程结束后它所占用的内存区域是否还有效?3:能不能被其它的数据所覆盖掉?4:这个窗体稳定吗?5:如果将Self换成nil在呢?6:如果将Form3的声明放在TForm1的私有域中呢?

解决方案 »

  1.   

    1. Form3这个变量在栈中,窗口在堆中
    2. 有效
    3. 可以覆盖,但后果自负
    4. 稳定
    5. 为什么不试一下?
    6. 所有的Delphi对象都隐含引用计数,将Form3放在私有域将保持一个引用,
       但通常不会对程序的运行造成影响。
      

  2.   

    1:这个Form3是在栈中建立的还是在堆中?
    堆中2:在过程结束后它所占用的内存区域是否还有效?
    有效3:能不能被其它的数据所覆盖掉?
    应该不会4:这个窗体稳定吗?
    没什么不稳定的5:如果将Self换成nil在呢?
      Self换成nil必须自己释放,
    未改时由Self管理其生命周期6:如果将Form3的声明放在TForm1的私有域中呢?
    没多大差别
      

  3.   

    ◆◆◆to:ZyxIp(绝望中...) 
    但是如果Form3这个指针在过程退出的时候清掉了,那么为什么我在窗体上再放一个button并Click并用Form3.Show还能显示出Form3??
    是不是因为Form3这个指针所在的内存只是被标志为没有被引用,但是还没有被其它数据覆盖?那么这时用Form3.Show是不是不安全的??
      

  4.   

    变量在栈中,对象在堆中,变量指向一个实例的指针,一个变量可以指向这个对象也可以让它指向另一个对象,当然一个对象也以有很多个变量指向它.当然也可以没有变量指向它.其实根本就不用这么写
    var
      Form3: TForm1;
    begin
      Form3 := Tform1.Create(Self);
      Form3.Show;
    end;写以这样也可以.Tform1.Create(Self).Show;
      

  5.   

    {
    ◆◆◆to:ZyxIp(绝望中...) 
    但是如果Form3这个指针在过程退出的时候清掉了,那么为什么我在窗体上再放一个button并Click并用Form3.Show还能显示出Form3??
    是不是因为Form3这个指针所在的内存只是被标志为没有被引用,但是还没有被其它数据覆盖?那么这时用Form3.Show是不是不安全的??
    }
    上面这些话我打错了。Form3是局部变量在其它过程中根本无法引用!当时不知道在想什么呢!我想,如果声明局部变量的Form,那么在建立时就不应该使其owner为nil,不然在过程中如果不释放它,那么过程结束后(程序结束前)如果没用全局变量保存它的指针或句柄就无法释放它!!如果反复的执行这样的过程会消耗很多的内存,并且在程序结束前无法释放。
      

  6.   

    http://community.csdn.net/Expert/topic/3808/3808741.xml?temp=.1342737http://community.csdn.net/Expert/topic/4077/4077204.xml?temp=.6157801http://community.csdn.net/Expert/topic/4129/4129652.xml?temp=.8251917
      

  7.   

    http://community.csdn.net/Expert/topic/3808/3808741.xml?temp=.1342737http://community.csdn.net/Expert/topic/4077/4077204.xml?temp=.6157801http://community.csdn.net/Expert/topic/4129/4129652.xml?temp=.8251917
      

  8.   

    千万不要指望传递了OWNER后有什么用,自己创建的一定要自己亲手释放。你可以在窗体的CLOSE事件中写 ACTIVE:=caFree;我的原则是要在过程中定义一个变量创建窗体,则这个窗体是SHOWMODAL的,在过程结束的时候将它释放。如果想创建一个SHOW的窗体,则将这窗体变量定义到private中.而且在窗体关闭时给创建它的对象发一个消息,就将这个变量:=Nil;