在 08-4-8,yaya...@gmail.com<yaya...@gmail.com> 写道:
> 在c++中使用引用计数,有什么好的办法解决循环引用问题。
> >
>
在 08-4-8,李扬<yaya...@gmail.com> 写道:
--
新的理论从少数人的主张到一统天下,并不是因为这个理论说服了别人抛弃旧观点,而是因为一代人的逝去。
My blog: http://googollee.blog.163.com
没有 gc 的时候, 设计别的对象释放的机制, 例如打 mark, 然后在系统 idle 循
环中进行清理之类的, 都可靠得多.
如果我选择用 C++ 做一个复杂一点的项目, 则倾向于不是大框架用脚本, C++ 只
是用来做部件, 这样就有别的生存期管理技术.
我已经不想和 C++ 里面的各种复杂的东西做斗争了. 要性能或者要实现底层代码,
就直接用 C 写 不怎么 OO 的程序, 反正这种代码规模不大, 加上不怎么 OO, 不
会有复杂的对象关系和生存期管理 ; 高层一些的代码, 要么用脚本语言, 要么用 D.
qq wu wrote:
> shared_ptr 和weak_ptr已经进入标准了, 还这么排斥啊?
> 有时候虽然可以解依赖, 但弱引用也是很有用的, 比如说, 它可以作为一个指针
> 的观察者
>
> 在08-4-8,*Googol Lee* <goog...@gmail.com
> <mailto:goog...@gmail.com>> 写道:
>
> gc?
>
> 在 08-4-8,李扬<yaya...@gmail.com <mailto:yaya...@gmail.com>>
> 写道:
> > 这个只是理论上可行的办法。不论是weakptr还是良好的设计。但是在一
> 个不断扩展的系统中需要有一种自动化的技术去检查循环依赖的问题。请问
> 有好的办法吗?
> >
> >
> > 在08-4-8,yzzrn <yz...@21cn.com <mailto:yz...@21cn.com>> 写道:
> >
> > > 同意.
> > > 把循环依赖解了就不会循环引用了.
> > >
> > > On 4月8日, 上午11时43分, "鋆邓" <tdzl2...@gmail.com
> <mailto:tdzl2...@gmail.com>> wrote:
> > > > 恩,所以我的建议就是,不要产生循环引用问题……
> > > >
> > > > 2008/4/8 vczh <GeniusV...@gmail.com
> <mailto:GeniusV...@gmail.com>>:
> > > >
> > > > > 引用计数无法解决循环引用问题,请换方法。
> > > >
> > >
> >
>
这都是一些用起来容易出错的技术---- 或许当时代码没有错, 但是代码演变过程
中, 这些点都是很危险的.
没有 gc 的时候, 设计别的对象释放的机制, 例如打 mark, 然后在系统 idle 循
环中进行清理之类的, 都可靠得多.
能具体说下怎么进行标记清理?
拿 Windows 客户端单线程程序举例, 由于各种对象之间互相调用, 以及可能的
sendmessage, 在消息处理过程中是否能够 delete 对象, 是搞不清楚的, 因此目
标对象的成员函数可能正在 call stack 中的, 即使目前的代码, delete 是安全
的, 但是这样的实现, 也非常脆弱, 改天调用链一改动, 可能就崩溃了 ---- 当
然, 也可以进行一堆严格的调用约定, 使得某些外层, 并且不允许被递归调用的函
数可以 delete 对象, 这种 函数 delete 对象之后, 不允许调用一般的函数 ----
这样同样麻烦, 脆弱性的改善也很有限.
用 com 技术代替delete 是可以的, C++ 用 com 虽然繁琐, 但是还不是很脆弱;
另外一个方法就是, 不再需要一个对象的时候, 不要立刻delete, 而是做一个标
记, 或者是往一个全局队列中登记一下, 等执行到主窗口 dispatchMessage 的那
个函数的时候 (如果你还担心这个也会递归进入, 那么加入一个递归次数计数器,
表明是最外层调用的时候, 才做下面的事情), 处理完所有的消息, 就检查需要释
放的对象, 在这里进行释放, 就安全了, 没有 call stack 的问题.
如果是多线程, 就麻烦一些了, 需要定义一些线程之间的同步协议, 这就看具体的
应用了.
服务器程序也是一样, 它会有一个select/poll 的 loop, 在这个最高层次的 loop
做这个事情, 就安全了.
C++ 的 autoptr, weakptr, 一堆概念, 烦啊, 类似的这些影响全局的东西, 如果
每引入一个, 程序可靠性降低5%, 多引入几个, 可靠性就越发低了. 还是简单为王.
哈哈.
不过老实说, 由于 OO 编程, method代码都是一小碎片一小碎片的, 对象之间互相
引用, 互相 call, callback 也多, 不支持 gc 还是太痛苦.
过程设计和编程的话, 函数之间的调用关系简单很多(虽然函数内部的实现可能痛
苦一些, 例如什么switch), 内存管理简单一些.
qq wu wrote:
> 那你直接使用原始指针就行了, 还要智能指针, 再加一个ref......
> 在08-4-14,*K.L.* <xxxK....@gmail.com <mailto:xxxK....@gmail.com>>