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

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

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

2)此类别使用辅助对象来保存引用计数.例如,不是将智能指针指向一个对象,它实际上指向这个元数据对象…谁有一个引用计数和up()和down()实现(以及谁通常提供一个机制来指针获取指向的实际对象,以便智能指针可以正确地实现运算符 – >()).

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

2的问题是,由于计数存储在另一个对象中,如果您有一个指向现有引用计数对象的指针被转换为引用的情况,则可能有一个错误(IE,因为计数不在实际的对象,没有办法得到新的引用的计数… ref ref的构造或赋值是很好的,因为他们可以共享count对象,但是如果你必须转换一个指针,完全憎恨)…

现在,据我了解,boost :: shared_pointer使用机制2,或类似的东西…那就是说,我不能完全弥补我的想法更糟糕!我只用过机制1,在生产代码…有谁有两种风格的经验?或者还有另一种方法比这两种更好?

最佳答案

“What is the best way to implement smart pointers in C++”

>不要!使用现有的,经过良好测试的智能指针,例如boost :: shared_ptr或std :: tr1 :: shared_ptr(std :: unique_ptr和std :: shared_ptr与C 11)
>如果你必须,请记住:

>使用safe-bool成语
>提供运算符>
>提供强有力的例外保证
>记录你的类在删除器上的异常要求
>在可能的情况下使用copy-modify-swap来实现强大的异常保证
>文档是否正确处理多线程
>写大量单元测试
>实现转换到基础,以便它将在派生指针类型(警察智能指针/动态删除智能指针)上删除,
>支持获取原始指针
考虑提供弱指针来打破周期的成本/效益
>为您的智能指针提供适当的投射操作符
使你的构造函数模板化,以处理从派生构造基指针.

不要忘记上面不完整列表中可能忘记的任何东西.

转载注明原文:在C中实现智能指针的最好方法是什么? - 代码日志