自动指针的优点/缺点

与普通指针相比,使用自动指针(auto_ptr)有哪些优缺点? 我听说它会自动释放内存,但它怎么不经常使用?


std::auto_ptr的主要缺点是它具有所有权转移语义。 这使得无法将std::auto_ptr存储在STL容器中,因为容器在存储或获取元素时会使用复制构造函数。

另外,我注意到std::auto_ptr另一个重要方面是它们不能用于使用PIMPL惯用语。 这是因为它们需要包装类的析构函数的完整定义。 有关更详细的讨论,请参阅clc ++。m上的此线程。

更新 :所有权转让

class Test {};
std::auto_ptr<Test> ap_test_1(new Test);
std::auto_ptr<Test> ap_test_2(new Test);

ap_test_2 = ap_test_1;  // here ap_test_1's ownership is transferred i.e. ap_test_2 is the 
                        // new owner and ap_test_1 is NULL.

请参阅Herb Sutter网站上的此线程,了解有关在STL算法使用的STL容器中使用时的含义的更多详细信息。


智能指针在C ++中经常使用,虽然可能不像应该那样频繁。 std::auto_ptr有一些问题(例如,你不能在标准库集合中使用它),但还有很多其他的问题。 其中最受欢迎的就是Boost库附带的库,它将成为下一个C ++标准的一部分 - 你应该看一看。

请注意,智能指针主要关于所有权,并删除动态创建的对象。 如果你没有动态创建的对象,你通常不需要智能指针:

{
  int i = 42;
  auto_ptr <int> p( & i );   // bad!
}

你真的不想这样做,因为当自动选取器超出范围时,它会尝试删除i。 不幸的是,我没有动态创建,所以会发生不好的事情。 所以在大多数C ++程序中,你需要两种指针,智能和正常。


不要将自动指针(std :: auto_ptr)与智能指针家族(特别是std :: auto_ptr,boost :: scoped_ptr和boost :: shared_ptr)混淆。

我几乎从不使用自动指针,因为在大多数情况下,我宁愿使用引用。 我唯一一次做的是无法在对象的构造函数中实例化的成员变量。

相反,智能指针非常强大,但这不是你的问题,我想:)

链接地址: http://www.djcxy.com/p/14031.html

上一篇: Advantages/disadvantages of auto pointers

下一篇: What uses are there for "placement new"?