funlxming 发表于 2004-10-26 08:22:00

为什么ARX的实体类采用动态分配,然后内部管理的方式进行操作.

为什么ARX采用内部管理内存的方式进行操作.比如往图纸新增一实体,只能是NEW一个实体,然后将它加入.而不能生成一个局部变量,将它加入.这样做有什么好处吗?

zfbj 发表于 2004-10-26 10:07:00

这个问题问得很好。


我试了一下,创建类的对象,然后添加到图形数据库中,是不能成功的。


虽然不太了解AutoCAD内部的实现机制,但是从小型CAD软件的开发中得到的启发是:图形数据库可能是一个类似链表的东西,也就是说,当你向数据库中Append一个对象时,相应的指针被添加到链表中(当然不可能直接作为链表的一个节点,而是节点的一部分),因此我们并没有执行delete的操作,而是在数据库被析构时一起释放了内存。


这也就解释了为什么不能直接用类的对象来创建实体的原因。


当然,只是一点个人看法,是否正确,有待指正。

funlxming 发表于 2004-10-26 11:48:00

我也觉得只能这样解释,但有点我却很不明白,如果真的是直接这样置入文件数据库的话,那像打开这样的操作返回的指针应该也是直接指向文件数据库的对像,这样是不是太危险了呢?

easypower 发表于 2004-10-26 15:06:00

文件--(ACAD管理)---内存---(ACAD管理)---我们生成的图元


这样是最安全的呀.


new是在堆中,要手动清空,而我们是在ACAD上做二次开发,也可以 说是插件,所以我们是不能自己释放已经加入块表纪录的实体,只能由ACAD来管理回收内存.同时这也是他实现Undo的关键所在.


另一方面,没有加入块表纪录的实体必须要自己手工delete掉,否则内存泄漏

funlxming 发表于 2004-10-27 09:04:00

事实上我是觉得用指针直接操作文件中的对像很危险,很容易破坏掉整个文件.暂时不说这个.想听听<A name=62255><FONT color=#990000><B>easypower</B></FONT></A> 对UNDO机制的理解.

easypower 发表于 2004-10-27 13:59:00

错!!你没直接操作文件!!


甚至你连操作已经加入块表纪录的实体指针的权限都不够大!


中间ACAD        的核心机制帮你管理了,所以,除非ACAD程序有问题,否则一点都不危险.


至於UNDO,当你对实体操作时,ACAD已经纪录下来了,而实体的内存物理存储又是他自己管理.所以他也就能实现了,谈不上什么理解,还很片面,大家探讨.

funlxming 发表于 2004-10-28 11:44:00

可能水平不够吧。看不懂你说的意思。不过我觉得打开返回的指针是直接指向文件中的对像的,关于UNDO,人人都知道肯定是作了记录的,但如何记录可就不会那么容易理解的了,像MFC里有个最简单绘图程序专门用来教学的,如果了解UNDO的一些基本思想的话,就可以试试看
页: [1]
查看完整版本: 为什么ARX的实体类采用动态分配,然后内部管理的方式进行操作.