我们几乎移为使用 boost::shared_ptr 在我们所有人的代码,但是我们仍然有一些孤立的情况下,我们使用 std::auto_ptr, 包括单一类:

template < typename TYPE >
class SharedSingleton
{
public: 
    static TYPE& Instance()
    {
        if (_ptrInstance.get() == NULL)
            _ptrInstance.reset(new TYPE);
        return *_ptrInstance;
    }

protected: 
    SharedSingleton() {};

private:
    static std::auto_ptr < TYPE > _ptrInstance;
};

我已经告诉有一个很好的理由为什么这个还没有做了一个 shared_ptr, ,但是对于我的生活我不能理解为什么?我知道, auto_ptr 最终将获得标记为折旧后的下一个标准,所以我想 知道什么/怎么样我可以更换这一执行.

此外,是否还有任何其他原因为什么你会考虑使用 auto_ptr 而不是一个 shared_ptr? 和你看到的任何问题移的情况在未来?


编辑:

  1. 因此,在回答"我可以安全地替换 auto_ptrshared_ptr 在上述码",答案是肯定的-但是我会带一小性的打击。
  2. auto_ptr 最终被标记为折旧和我们移动到 std::shared_ptr, 我们只需要彻底测试我们的代码来确保我们遵守不同所有权的语义。
有帮助吗?

解决方案

auto_ptrshared_ptr 解决完全不同的问题。一个不会取代其他的。

auto_ptr 是一个薄的包装指针的实施 RAII 语义,因此,资源总是释放,甚至当面对例外情况。 auto_ptr 不执行任何参考数等,它不会使多个指针指向同一物体在创建的副本。事实上,这是非常不同。 auto_ptr 是一个几类转让操作修改 来源 对象。考虑这个无耻的插头 auto_ptr维基百科页:

int *i = new int;
auto_ptr<int> x(i);
auto_ptr<int> y;

y = x;

cout << x.get() << endl; // Print NULL
cout << y.get() << endl; // Print non-NULL address i

注意如何执行

y = x;

修改不仅y但也x。

boost::shared_ptr 模板使得易于处理多指向同样的对象,对象是仅删除最后的参照它出去的范围。这个特征是没有用你的方案,其(企图)实施一个 单独.在你的情况下,总是有0引用1所参照的唯一对象的类,如果有的话。

实质上, auto_ptr 目的和 shared_ptr 对象具有完全不同的语(这就是为什么你不能使用的以前在容器,但这样做与后者被罚款),我当然希望你有很好的测试发现任何倒退你介绍的同时,移植你的代码。:-}

其他提示

其他人已回答为什么这个代码使用 auto_ptr 而不是一个 shared_ptr.解决您的其他问题:

什么/怎么样我可以更换这一执行?

使用 boost::scoped_ptrunique_ptr (可在推动和新C++标准)。既 scoped_ptrunique_ptr 提供严格的所有权(和没有参考数overhead),andthey避免令人惊讶的删除-上复制的语义 auto_ptr.

此外,是否还有任何其他原因为什么你会考虑使用 auto_ptr 而不是一个 shared_ptr?和你看到的任何问题的动向 shared_ptr 在未来?

就个人而言,我将不使用 auto_ptr.删除-上复制只是太非常直观。 药萨特似乎都同意.切换到 scoped_ptr, unique_ptr, 或 shared_ptr 应该提供任何问题。具体地说, shared_ptr 应该是一个简易替换如果你不关心基准计算的开销。 scoped_ptr 是一个简易替换如果不使用 auto_ptr's转让所有权的能力。如果您使用的转移的所有权,然后 unique_ptr 几乎是替代,除非你需要,而不是明确地呼叫 move 转移所有权。看看 在这里, 对于一个例子。

auto_ptr是唯一的一种明智的指针。我使用它,因为我不用提升,并且因为我通常喜欢我的商业应用为导向的课程明确地 定义中删除的语义和秩序,而不是取决于 收集的,或者个人,聪明的指针。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top