游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4514|回复: 11

出个考题,考考大家对vb对象的认识

[复制链接]

187

主题

600

帖子

606

积分

高级会员

Rank: 4

积分
606
QQ
发表于 2005-9-3 13:36:00 | 显示全部楼层 |阅读模式
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Sub Form_Load()
    Dim test As Form1
    CopyMemory test, Me, 4
    Debug.Print test.Caption
End Sub

请问
1、单步执行代码到第三行有什么显示??
2、执行完End Sub会有什么反应??
并解释一下理由,呵呵,这是最近写代码的时候实际碰到的一个调试实例,建议大家可以一起将自己日常见到的问题共同交流一下。回答正确的人有奖励哦~

187

主题

600

帖子

606

积分

高级会员

Rank: 4

积分
606
QQ
 楼主| 发表于 2005-9-3 13:37:00 | 显示全部楼层

Re:出个考题,考考大家对vb对象的认识

3、请你提出一个合理的解决方案

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2005-9-3 20:41:00 | 显示全部楼层

Re:出个考题,考考大家对vb对象的认识

如果没搞错的话,立即窗口显示Form1

执行完End Sub应该没有什么反应。

187

主题

600

帖子

606

积分

高级会员

Rank: 4

积分
606
QQ
 楼主| 发表于 2005-9-3 21:20:00 | 显示全部楼层

Re:出个考题,考考大家对vb对象的认识

真的吗???你用VB6运行试过了
我的机器估计跟你的不一样啊!!哈哈End Sub 在Win98+VB6下马上挂掉!
不知2000以上的系统结果会怎么样!嘿嘿,那个兄弟测试一下哦

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2005-9-3 21:23:00 | 显示全部楼层

Re:出个考题,考考大家对vb对象的认识

哦,我试着运行了一次,对象装载完毕后没有任何问题,但是关闭窗口Terminate事件结束后就挂掉了。

187

主题

600

帖子

606

积分

高级会员

Rank: 4

积分
606
QQ
 楼主| 发表于 2005-9-3 22:00:00 | 显示全部楼层

Re:出个考题,考考大家对vb对象的认识

对的!就是这个现象咯!呵呵 我还以为你的机器不一样呢
解释一下咯

187

主题

600

帖子

606

积分

高级会员

Rank: 4

积分
606
QQ
 楼主| 发表于 2005-9-4 22:06:00 | 显示全部楼层

Re:出个考题,考考大家对vb对象的认识

算了,估计大家对这个问题研究不多啊,公布答案吧:
Private Sub Form_Load()
    Dim test As Form1
    CopyMemory test, Me, 4
    Debug.Print test.Caption
End Sub
test其实是一个对象的指针,CopyMemory test, Me, 4语句使得test指针指向了Form1
所以Debug.Print test.Caption输出的是 Form1
在执行完End Sub后test作为一个过程变量将被系统清除调,类似于执行了一个
Set Test=Nothing语句
导致的结果是Form1对象实体的引用计数-1,变为了0,尽管并没有释放对象,但是系统根据对象计数认为已经没有了。
在用户关闭窗体的时候,VB内部再次释放Form1,但是由于FOrm1的对象计数已经为0了,会因为一个保护错误,因为vb试图删除一个已经销毁的对象(因为计数=0)

187

主题

600

帖子

606

积分

高级会员

Rank: 4

积分
606
QQ
 楼主| 发表于 2005-9-4 22:11:00 | 显示全部楼层

Re:出个考题,考考大家对vb对象的认识

我们解决的方法是
Private Sub Form_Load()
    Dim test As Form1
    CopyMemory test, Me, 4
    Debug.Print test.Caption
  CopyMemory test, 0&, 4
End Sub
注意最后的一行,我们使用了CopyMemory test, 0&, 4,将该指针强制清除掉,这样在End sub后即使系统在自动执行Set test=Nothing也不会将Form1的引用计数-1,所以在用户关闭窗体的时候是正常的结束

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
发表于 2005-9-4 23:44:00 | 显示全部楼层

Re:出个考题,考考大家对vb对象的认识

问个题外问题,CopyMemory第三个参数为什么是4?

我只知道的写法是
Private Sub Form_Load()
    Dim test As Form
    Set test = Me
    Debug.Print test.Caption
  Set test = Nothing
End Sub

14

主题

149

帖子

149

积分

注册会员

Rank: 2

积分
149
发表于 2005-9-5 07:41:00 | 显示全部楼层

Re:出个考题,考考大家对vb对象的认识

我是学 DELPHI 偶尔看到这个!
我帮楼主回答下吧!

也不知道对不对

zlcnkkm
之所以是4 是因为 test 是指针
一个指针所占长度就为 4
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-27 16:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表