在VC 8中替换auto_ptr

前端之家收集整理的这篇文章主要介绍了在VC 8中替换auto_ptr前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
std :: auto_ptr在VC 8中被破坏(这是我们在工作中使用的).我的主要抱怨是它允许auto_ptr< T> x = new T();这当然会导致可怕的崩溃,而很容易做错误.

answer到另一个问题stackoverflow:

Note that the implementation of std::auto_ptr in Visual Studio 2005 is horribly broken.
07001
07002

我想用

> boost :: scoped_ptr,用于不应该通过所有权的指针.
> boost :: shared_ptr,用于容器和其他需要的地方的指针.
> std :: auto_ptr,用于应该/可以传递所有权的指针.

但是由于std :: auto_ptr对我来说是坏的,我想知道最好的方法是什么:

>将std :: auto_ptr替换为来自网络的东西.像这个this一个来自Rani Sharoni(还没有尝试过).
>改用boost :: shared_ptr.当然会工作,虽然会有一些较小的开销,我不在乎.但是我想使用auto_ptr来表示指针的意图. (见this答案就此方式进行投票.)
>我在实践中永远不需要通过所有权,所以我不用担心.

更新:
这是我做的:
我复制了Rani Sharoni所提到的auto_ptr实现. From here.

做了一些小的测试:

class T
{
public:
    T() {
        OutputDebugStringA("T\n");
    };
    ~T() {
        OutputDebugStringA("~T\n");
    };
};

{
    fix::auto_ptr<T> x(new T); // This just works.
}
{
    fix::auto_ptr<T> x = (new T); // Doesn't compile. Great!
}
{
    fix::auto_ptr<T> x = fix::auto_ptr<T>(new T); // Transfer of ownership works also.
}

当然,这些测试并不是详尽的,你不应该相信他们.实施一个异常安全的模板类是有毛皮的业务.至少这比内置的更好.

注意:关于版权,我不知道我是否被允许使用这个实现.我已经通过电子邮件发送给Rani,我正在等待回复.当我知道更多时,我会更新这篇文章.
允许所有人按照您的愿望使用Rani Sharoni的auto_ptr实现.

谢谢你的回复.

解决方法

移动以提高智能指针.

在此期间,您可能希望从旧的/另一个STL中提取一个工作的auto_ptr实现,因此您有工作代码.

我相信auto_ptr语义基本上是破碎的 – 它可以保存打字,但是界面实际上并不简单:您还需要跟踪当前所有者的哪个实例,并确保所有者离开最后.

unique-ptr“修复”,通过发布不仅放弃所有权,而且将RHS设置为null.它是auto-ptr的最接近的替代品,但它具有不同的语义,它不是一个替代品.

有一个介绍性的文章boost smart pointers,由,我,我.

猜你在找的C&C++相关文章