为啥 set/get_default_resource 使用指针而不是引用?
Posted
技术标签:
【中文标题】为啥 set/get_default_resource 使用指针而不是引用?【英文标题】:Why set/get_default_resource use pointer and not reference?为什么 set/get_default_resource 使用指针而不是引用? 【发布时间】:2019-09-04 18:21:23 【问题描述】:当使用 C++17 多态分配器和 set/get_default_resource 方法(例如,参见 https://en.cppreference.com/w/cpp/memory/set_default_resource)时,所有资源都通过指针传递/返回,而使用 nullptr 几乎没有意义,而且感觉它可以大部分时间是一个参考(如果需要,然后存储为 ref_wrapper)。
这有什么合乎逻辑/风格的原因吗?
【问题讨论】:
我想以new
的方式处理内存更容易;也就是说,返回一个指向已分配内存块的指针。
这不是重点。我不是在谈论内存资源的分配/释放,而是在谈论内存资源的传递方式。 memory_resource 在分配时返回指针的原因不是因为它更容易以与 new 相同的方式执行,而是因为分配可能失败(例如:由于内存不足)因此返回 nullptr 是有效的。
【参考方案1】:
当您链接的页面引用时,set_default_resource()
确实接受空指针,并且针对这种情况具有特定行为:
如果
r
不为null,则设置默认内存资源指针为r
;否则,将默认内存资源指针设置为std::pmr::new_delete_resource()
。
最初的论文 N3525 也引用了理由:
我们发现在各种接口中使用
nullptr
作为“default-default”处理程序的代理很方便。这里的使用只是提供了一致性,并且可以很容易地将默认资源重置为其初始状态。
随后的修订版N3916 指出:
请注意,内存资源库的设计使得
ShoppingList
构造函数接受指向memory_resource
的指针,而不是对 a 的引用memory_resource
。注意到一种常见的做法是使用参考 而不是在空指针超出合同的情况下使用指针。但是,有一种更引人注目的做法是避免构造函数通过引用获取对象并存储其地址。我们还希望避免传递非常量引用,因为这通常也被认为是不好的做法(重载运算符除外)。
【讨论】:
关于第一点,这是一个很好的解释。关于第二个,我仍然不明白为什么 get/set 返回指针而不是引用,以及为什么 polymorphic_allocator 确实接受指针而不是引用。 您对“传递非常量引用 [...] 通常被认为是不好的做法(重载运算符除外)”有任何了解吗? “有一种更引人注目的做法是避免构造函数通过引用获取对象并存储其地址”:这背后的原因是什么?以上是关于为啥 set/get_default_resource 使用指针而不是引用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?