【问题标题】:std::auto_ptr<T> Usagestd::auto_ptr<T> 用法
【发布时间】:2024-01-11 18:44:01
【问题描述】:

我在体面的教科书中阅读了相当多的关于 auto_ptr 类的内容。虽然我了解它是什么,以及它如何帮助您解决在构造函数等地方获取异常的问题,但我无法弄清楚何时有人会真正使用它。

auto_ptr 只能保存一个类型(不支持数组 new[] 初始化)。当您将其传递给函数或尝试复制它时,它会更改所有权(它不是引用计数智能指针)。

这个类的实际使用场景是什么?似乎大多数使用它的教科书示例都达到了,因为在大多数情况下甚至没有理由在堆栈变量上使用指针...

无论如何,我会停止我的咆哮 - 但如果您能为此提供一个简短的示例/描述或指向一个好的使用场景的链接,我将不胜感激。我只是想知道在实践中应该在哪里使用它,以防遇到这种情况 - 我喜欢练习我学到的东西,以便记住它。

【问题讨论】:

  • 如果你有一个类管理它自己的大型动态成员,那么你最好将它包装在一个 auto_ptr 中,而不是 deleteing 析构函数中的成员。这也使得通过 const-reference 进行复制变得不可能,这是一件好事。如果类型是动态的,工厂可以通过auto_ptr 返回成员。也不是完全没用!
  • 您的书可能使用包裹在auto_ptr 中的琐碎对象来演示用法。在实际代码中,对象可能不是那么微不足道,我不会立即打折……

标签: c++ stl auto-ptr


【解决方案1】:

我会给你一个很好的用法的简短例子。考虑一下:

auto_ptr<SomeResource> some_function() {
    auto_ptr<SomeResource> my_ptr = get_the_resource();

    function_that_throws_an_exception();

    return my_ptr;
}

引发异常的函数通常会导致您的指针丢失,并且指向的对象不会被删除。对于auto_ptr,这不会发生,因为它在离开创建它的框架时被销毁,如果它没有被分配(例如return)。

【讨论】:

  • 基本上你是在转让所有权。任何您想转移对象 std::auto_ptr 所有权的情况都很棒,因为它不仅使转移异常安全,而且使用 auto_ptr 是记录转移的一种方式。
【解决方案2】:

auto_ptr 在现已最终确定的 C++11 标准中已被弃用。一些替代品已经可以通过 TR1 或 Boost 库获得。例如shared_ptrunique_ptrscoped_ptr 在提升中)。

【讨论】:

  • 感谢您的信息,很高兴知道他们正在更新新标准中的智能指针 :)
  • scoped_ptrunique_ptr 略有不同。 scoped_ptr 不能从函数返回,我认为它也不能被移动(用 C++11 的说法)。 unique_ptr 需要 C++11 的移动语义。但是,如果您只需要在函数中保存引用,它们是可以互换的。