第一个问题:请先看这个过程.过程前定义了一个临时变量,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的地址.给我的感觉就是,对于这种对象用不用指针是一样的???请高手指点一下....先谢过了.
那如果是在堆上分配的话,程序中不手动销毁它的话,不是会造成内存泄漏???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的地址.给我的感觉就是,对于这种对象用不用指针是一样的???请高手指点一下....先谢过了.
解决方案 »
- 已知密文文件和公钥文件,如何用Libeay32.dll中的RSA_public_decrypt()函数进行解密?
- 我要装双系统,听说有个软件是可以测试双系统的,这样就不怕系统崩溃了,忘了名子了,哪位高人知道啊。
- 请问类TeThemeForm在哪一个控件包中啊,在哪里好下载的啊,谢谢!
- 急,急,急,不够再加分!我做通过mscomm与考勤机进行通讯,把一个tmp表中的数据写入考勤机中,第一次下传是成功的,第二次下传后,考勤
- 如何知道合并后的excel单元格,原来是有那些单元格构成
- 怎么样使MEDIAPLAYER重复播放N次?
- 如何关掉动态建的form
- 如何把图象通过流存到数据库中?急!急!急!
- dbexpress+oracle9i的问题
- 关于winsock数据头
- combobox
- 一个简单的MDI窗体的问题
var
tvTempNode : TTreeNode;
tempDBConn : TADOConnection;
begin
tempDBConn := TADOConnection.Create(Self);
tvTempNode.Data := tempDBConn; // 这里也有个问题,是保存的对象还是什么,照理对象是不能保存进去的吧.
end;
tempDBConn是你过程的一个临时的变量,保存指针,它是存在栈中的。所以过程结束,就无法访问。
但是TADOConnection.Create(Self);说明你的连接对象是创建在堆中的,而且参数是self,说明属主是当前的form,只要当前的form不销毁,还有你不主动去销毁这个连接对象,它都是存在的,只要有它的地址,都是可以访问它的。这就是为什么你能通过tvTempNode.Data 访问他的原因。
是在堆里分配内存.所以你可以在以后的运行找到,self指的是TFOME1,当你的
FORM1销毁时,那么你的对象也跟着销毁了, tvTempNode.Data := tempDBConn; // 这里也有个问题,是保存的对象还是什么,照理对象
是不能保存进去的吧.
Data 是一个指针,那么可以肯定tempDBConn肯定是一个指针
tempDBConn := TADOConnection.Create(Self);
tvTempNode.Data := tempDBConn;
与下面的代码功能是类似的, tempDBConn : ^TADOConnection;
begin
New(tempDBConn);
tempDBConn^ := TADOConnection.Create(Self)
tvTempNode.Data := tempDBConn;
end;
但是我觉得也有些不同
C++的对象是可以真正放在STACK上的!!