自动指针的优点/缺点
与普通指针相比,使用自动指针(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