问一个基础的问题,关于对象的创建和引用。(100分)

  • 主题发起人 主题发起人 wbcp2000
  • 开始时间 开始时间
W

wbcp2000

Unregistered / Unconfirmed
GUEST, unregistred user!
定义一个TX.
TX = class
public
m_buf: string;
end;
然后,定义两个实例对象
m_x1: TX;
m_x2: TX;

执行如下:语句先
m_X1 := TX.Create;
m_x1.m_buf := 'welcome';
m_x2 := m_x1;

此时,m_x2等于就是m_x1.

然后执行
m_x1.Free;
m_x1 := nil;

此时再来观察,m_x2,发现m_x2并不为NIL,但已不可访问。

请问各位大侠有什么方法,出当m_x1释放后,能够检测出m_x2不可访问。

谢谢啦,欢迎大家热烈讨论
 
执行如下:语句先
m_X1 := TX.Create;
m_x1.m_buf := 'welcome';
m_x2 := m_x1; //此时把X1地址复制给X2,

此时,m_x2等于就是m_x1.

然后执行
m_x1.Free; //此时,X1地址已经释放,那么X2的地址也不存在了,所以X2无法访问
m_x1 := nil;
 
procedure TForm1.Button1Click(Sender: TObject);
var s1,s2 :tstringlist;
begin
s1:=tstringlist.Create;
s1.Add('1234');
s2:=s1;
showmessage(s2.Text);
s1.Free;
s1:=nil;

end;

结果s2 还是可以访问。
 
关--注
 
不好意思 lz 我先前的 代码有问题。 呵呵,确实如你所说的是 m_m2 还存在,访问好像也能访问,只是 里面数据是空的了。
 
我来跟你解释一下吧:
执行如下:语句先
m_X1 := TX.Create; //为m_X1指针分配内存空间
m_x1.m_buf := 'welcome';
m_x2 := m_x1; //m_x2为一个TX指针,现在指向m_x1

此时,m_x2和m_x1指向的内容相同

然后执行
m_x1.Free; //释放m_x1指向的内容

m_x1 := nil; //指针m_x1批向空值

此时,指针m_x2指向的内容已被释放,但指针m_x2还指向原来指向的地址
当你继续把m_x2当TX对象使用时就会出问题了,所以不要这么用吧。
 
m_x2 := m_x1; //此时把X1地址复制给X2,

这个解释应该是错的。对象赋值,只是将m_x1 的变量地址 赋给m_x2 的变量地址 。而不是两个对象 内存块 之间的 地址 传递。

m_x1 ,m_m2 被定义成 TX的 对象 或者 类引用的时候,就自动分配了内存地址,然而变量 的表现在 对象中 只是一个 地址的引用罢了。
所以 m_x1 freeandnil 的时候, m_x1释放了 所有的资源, 但并不能释放 m_x2 本身的 那块资源。不过m_x2的变量 的地址 因为是指向 m_x1的变量地址(已经free掉),所以m_x2 的变量 也就没value 了。

以上是我个人的理解。希望多多讨论。
 
一个释放后自动清空实例指针的类
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1556758
 
大家讲的很有道理。
但是,我想知道通过什么办法,能够判断m_x2,是否有效。
因为释放m_x1时,m_x2是不知道的。
有没有什么办法,检测m_x2的有效性。

当然,将m_x2声明成指针的方式,是可以解决此问题的。
 
没有办法检测它的有效性,在编程的时候你必须自己记住每一时刻m_x2在内存里是个什么状态
 
我觉得,将m_x2声明成指针的方式,实际上是直接将m_x1地址复制了。
m_x1释放后,m_x2相应也nil了

但是m_x2没有声明成指针的方式时,m_x2中实际上是m_x1地址中内容的引用。
因而,m_x1释放后,m_x2只是内容相应也没了,但地址还在。

对不对?
 
难道真的就没有办法,来检测M_X2的可用性吗?
这样在DELPHI里,引用对象要非常小心,因为它很可能在某个时候就不存在了。

还是C++,比较简单,直接用指针来操作,非常方便。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部