当前位置:  开发笔记 > 编程语言 > 正文

在C++中实现智能指针的最佳方法是什么?

如何解决《在C++中实现智能指针的最佳方法是什么?》经验,为你挑选了3个好方法。

我一直在评估各种智能指针实现(哇,有很多),在我看来,大多数可以分为两大类:

1)此类别对引用的对象使用继承,以便它们具有引用计数,并且通常实现up()和down()(或它们的等价物).IE,要使用智能指针,您指向的对象必须从ref实现提供的某些类继承.

2)此类别使用辅助对象来保存引用计数.例如,不是将智能指针指向对象,而是实际指向此元数据对象...谁具有引用计数以及up()和down()实现(并且通常为指针提供一种机制)获取指向的实际对象,以便智能指针可以正确实现operator - >()).

现在,1有一个缺点,它强制你想引用的所有对象计数从一个共同的祖先继承,这意味着你不能使用它来引用你无法控制源代码的计数对象至.

2有一个问题,因为计数存储在另一个对象中,如果你有一个指向现有引用计数对象的指针被转换为引用的情况,你可能有一个错误(IE,因为计数不在实际的对象,新的引用没有办法得到计数...引用ref复制构造或赋值是好的,因为它们可以共享count对象,但如果你必须从指针转换,你'完全被冲洗了)...

现在,正如我所理解的那样,boost :: shared_pointer使用了机制2,或类似的东西......那就是说,我不能完全决定哪个更糟糕!我只使用机制1,在生产代码中......有没有人有这两种风格的经验?或许还有另一种方式比这两种方式更好?



1> Aaron..:

"在C++中实现智能指针的最佳方法是什么?"

    别! 使用现有的经过良好测试的智能指针,例如boost :: shared_ptr或std :: tr1 :: shared_ptr(std :: unique_ptr和std :: shared_ptr与C++ 11)

    如果必须,请记住:

      使用safe-bool成语

      提供运营商 - >

      提供强有力的例外保证

      记录您的类对删除器的异常要求

      尽可能使用copy-modify-swap来实现强大的异常保证

      记录您是否正确处理多线程

      写广泛的单元测试

      以这样的方式实现转换为base,它将在派生的指针类型上删除(policied smart pointers/dynamic deleter smart pointers)

      支持访问原始指针

      考虑提供破坏周期的弱指针的成本/利益

      为您的智能指针提供合适的铸造操作符

      使您的构造函数模板化以处理从派生构造基指针.

不要忘记我在上面不完整的清单中遗忘的任何事情.



2> Don Wakefiel..:

只是为无处不在的Boost答案提供不同的视图(即使它是许多用途的正确答案),看看Loki的智能指针实现.对于设计哲学的讨论,Loki的原始创作者编写了" 现代C++设计 "一书.



3> Adrian Grigo..:

我已经使用boost :: shared_ptr好几年了,虽然你正确的下行(没有通过指针可能的任务),我认为这绝对是值得的,因为它节省了大量与指针相关的错误.

在我的自制游戏引擎中,我尽可能地用shared_ptr替换了普通指针.如果你通过引用调用大多数函数,那么性能上升的原因实际上并不是那么糟糕,因此编译器不必创建太多临时的shared_ptr实例.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有