【问题标题】:The std::get_temporary_buffer returns raw pointer instead of smart onestd::get_temporary_buffer 返回原始指针而不是智能指针
【发布时间】:2015-07-21 12:27:33
【问题描述】:

std::get_temporary_buffer 返回一个std::pair,其中包含一个指向已分配存储的开头和已分配对象数量的指针,其对应对象的唯一目的:std::return_temporary_buffer 是释放先前使用std::get_temporary_buffer 分配的内存.

这两个函数都位于<memory> 标头上,其主要目的是提供工具来增强内存管理(顾名思义)并使内存管理更加安全。

关于内存管理的安全性,<memory> 标头还提供了智能指针实用程序,它允许以类似RAII 的方式管理内存,从而使内存管理异常安全。

C++14 还添加了std::make_unique 辅助函数,因此我们现在可以避免在许多情况下使用原始指针。

通过所有这些努力减少原始指针的使用,意识到std::get_temporary_buffer 返回的是原始指针而不是智能指针是相当令人困惑的。这就是我想问的原因:

  • std::get_temporary_buffer 是否有任何理由返回原始指针而不是返回智能指针?
  • 如果这种“老式”方式手动分配和取消分配内存是有原因的,那么智能指针无法实现的目标是什么?

【问题讨论】:

    标签: c++ c++11 memory-management


    【解决方案1】:

    简单的答案是 std::get_temporary_buffer 是在智能指针标准化之前创建的,在 C++11 中更改 std::get_temporary_buffer 的返回值会破坏依赖它的代码,这对于 C++ 标准来说是绝对不能接受的图书馆。

    现在,他们为什么不标准化一个新的智能指针等价物? 好吧,也许没有人有兴趣拥有一个。就个人而言,我觉得让一个智能指针拥有许多对象很奇怪。如果您需要智能阵列,请使用std::vector

    【讨论】:

      【解决方案2】:

      如果您查看 get_temporary_buffer 等人的旧 SGI STL 实现的文档,他们会说...

      注意:get_temporary_bufferreturn_temporary_buffer 仅用于向后兼容。如果您正在编写新代码,则应改用 temporary_buffer 类。

      这有效地承认了更好的自动化管理的可取性。 GCC 添加了temporary_buffer 作为扩展(参见here),但它从未成为标准。总而言之,它并没有那么有用,因此拥有更好的界面不会成为优先事项。操作系统猜测它是否应该为您提供所有请求的内存或一些较小数量的整个概念与大多数现代操作系统使用的乐观内存分配策略背道而驰,并且一旦您收到多个请求而不是容易获得的请求记忆力,对第一个过于慷慨会让其他人有点挨饿:只是不是一个非常实际的概念。

      如果您在意,您可以提交关于以后的 C++ 标准的提案......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-01
        • 1970-01-01
        • 2016-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-30
        • 2018-03-22
        相关资源
        最近更新 更多