自动指针的优点/缺点

jas*_*ine 6 c++ smart-pointers

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

Abh*_*hay 10

主要缺点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.
Run Code Online (Sandbox Code Playgroud)

有关在STL算法使用的STL容器中使用时的含义的更多详细信息,请参阅Herb Sutter网站上的主题.


小智 6

智能指针 C++中经常使用,但也许不是,因为他们经常要.该std::auto_ptr有几个问题(你不能在标准库集合使用它,例如),但也有许多其他问题.其中最受欢迎的是Boost库附带的那些,它们将成为下一个C++标准的一部分 - 你应该看看.

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

{
  int i = 42;
  auto_ptr <int> p( & i );   // bad!
}
Run Code Online (Sandbox Code Playgroud)

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

  • `auto_ptr`不经常使用,因为在大多数情况下,来自Boost的那些更好.智能指针*经常被使用,并且至少在许多程序员中使用,比常规指针更常见.为什么你认为更经常使用普通指针? (3认同)