第一个问题:请先看这个过程.过程前定义了一个临时变量,tempDBConn,请问在TADOConnection.Create(Self)后,它是在什么地方分配的内存呢?如果是在栈上,那么出作用域的时候,那么该对象就应该被销毁了啊,但好象实际上不是.因为我在后面的过程中,还可以通过tvTempNode.Data的值找到这个对象.
那如果是在堆上分配的话,程序中不手动销毁它的话,不是会造成内存泄漏???procedure TfrmMain.OpenLibrary(Sender: TObject);
var
  tvTempNode : TTreeNode;
  tempDBConn : TADOConnection;
begin
    tempDBConn := TADOConnection.Create(Self);
    tvTempNode.Data := tempDBConn; // 这里也有个问题,是保存的对象还是什么,照理对象是不能保存进去的吧.
end;第二个问题,过程稍微有改动.procedure TfrmMain.OpenLibrary(Sender: TObject);
var
  tvTempNode : TTreeNode;
  tempDBConn : ^TADOConnection; // 这里声明了一个指针
begin
    New(tempDBConn); // 这里应该是在堆上分配的内存了吧?
    tempDBConn^ := TADOConnection.Create(Self);
    tvTempNode.Data := tempDBConn; // 这里保存的还是指针了吧?
end;在后面的过程中也可以通过tvTempNode.Data获得tempDBConn的地址.给我的感觉就是,对于这种对象用不用指针是一样的???请高手指点一下....先谢过了.

解决方案 »

  1.   

    procedure TfrmMain.OpenLibrary(Sender: TObject);
    var
      tvTempNode : TTreeNode;
      tempDBConn : TADOConnection;
    begin
        tempDBConn := TADOConnection.Create(Self);
        tvTempNode.Data := tempDBConn; // 这里也有个问题,是保存的对象还是什么,照理对象是不能保存进去的吧.
    end;
    tempDBConn是你过程的一个临时的变量,保存指针,它是存在栈中的。所以过程结束,就无法访问。
    但是TADOConnection.Create(Self);说明你的连接对象是创建在堆中的,而且参数是self,说明属主是当前的form,只要当前的form不销毁,还有你不主动去销毁这个连接对象,它都是存在的,只要有它的地址,都是可以访问它的。这就是为什么你能通过tvTempNode.Data 访问他的原因。
      

  2.   

    第一个问题:TADOConnection.Create(Self)后,它是在什么地方分配的内存呢
               是在堆里分配内存.所以你可以在以后的运行找到,self指的是TFOME1,当你的
               FORM1销毁时,那么你的对象也跟着销毁了,           tvTempNode.Data := tempDBConn; // 这里也有个问题,是保存的对象还是什么,照理对象
               是不能保存进去的吧.
                Data 是一个指针,那么可以肯定tempDBConn肯定是一个指针
                   
      

  3.   

    第二个问题:
            tempDBConn := TADOConnection.Create(Self);
            tvTempNode.Data := tempDBConn; 
            与下面的代码功能是类似的,           tempDBConn : ^TADOConnection; 
             begin
               New(tempDBConn); 
               tempDBConn^ := TADOConnection.Create(Self)
               tvTempNode.Data := tempDBConn;
             end;
    但是我觉得也有些不同
      

  4.   

    这是OBJECTPASCAL自己的一个机制,对于对象都是用指针思想的,只是在写赋值语句时不一样而已!!!
    C++的对象是可以真正放在STACK上的!!