当你使用一种标准::auto_ptr而不是提升::情况?
-
22-07-2019 - |
题
我们几乎移为使用 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
? 和你看到的任何问题移的情况在未来?
编辑:
- 因此,在回答"我可以安全地替换
auto_ptr
与shared_ptr
在上述码",答案是肯定的-但是我会带一小性的打击。 - 时
auto_ptr
最终被标记为折旧和我们移动到std::shared_ptr
, 我们只需要彻底测试我们的代码来确保我们遵守不同所有权的语义。
解决方案
auto_ptr
和 shared_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_ptr
或 unique_ptr
(可在推动和新C++标准)。既 scoped_ptr
和 unique_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是唯一的一种明智的指针。我使用它,因为我不用提升,并且因为我通常喜欢我的商业应用为导向的课程明确地 定义中删除的语义和秩序,而不是取决于 收集的,或者个人,聪明的指针。