【问题标题】:Given a pointer to heap allocated memory, how do smart pointer implementations find the appropriate deallocation function for it?给定一个指向堆分配内存的指针,智能指针实现如何为它找到合适的释放函数?
【发布时间】:2020-02-02 22:35:49
【问题描述】:

为了练习,我正在尝试用 C++ 构建一个自定义智能指针库。

现在,我想,这个小项目会很简单,只需要一个指针列表,每个指针的引用数量的另一个列表,以及一个封装所有这些性感功能的智能指针类。

嗯,不,当然没那么简单,我很快就遇到了问题。给定一个指向堆分配内存的任意指针,我如何编写我的类,以便它以某种方式在某个时候找到用于该指针的正确取消分配函数(new -> delete,new[] -> delete[ ]、malloc/realloc -> 免费等)

除此之外,还有一个问题是我是否可以假设这个取消分配函数只会接受参数,这感觉像是一个不安全的假设,因为上帝只知道可能有两个隐藏在我使用的某个库中的参数取消分配函数。

我可以通过创建一个抽象类来解决这个问题,然后要求我的库的用户只使用从它派生的类和我的智能指针实现,但这感觉很糟糕,坦率地说没有启发性。

我已经搜索了一段时间,但我根本找不到合适的答案。因此,我在这里问你们是否可以向我解释实际的智能指针实现如何解决这个问题,他们如何处理这些问题?他们甚至会打扰吗?

【问题讨论】:

  • 标准库中的智能指针不会试图神奇地确定适当的释放函数。它们需要一个作为模板参数 (std::unique_ptr) 或在运行时提供,例如作为构造函数参数 (std::shared_ptr)。对于指向非数组类型的指针,默认值为 delete,对于数组,默认值为 delete[](如在 std::unique_ptr<int[]> 中)。另见:std::default_delete
  • 他们当然是这样做的,我是个白痴。 :(
  • @IgorTandetnik 您应该将其发布为答案。

标签: c++ smart-pointers


【解决方案1】:

标准库中的智能指针不会试图神奇地确定适当的释放函数。他们希望提供一个,作为模板参数 (std::unique_ptr) 或在运行时,例如作为构造函数参数(std::shared_ptr)。如果未指定删除器,则默认为 delete 用于指向非数组类型的指针,或 delete[] 用于数组(如std::unique_ptr<int[]>)。

另请参阅:std::default_delete

【讨论】:

  • Thx m8,我知道删除器以及您可以手动指定它的事实,但我没有意识到它也不是自动的。这意味着在我很少使用智能指针的情况下,我很确定我的实现会导致微妙的内存泄漏,这既令人恐惧(它们泄漏在你身上蔓延),而且考虑到智能指针的目的,这有点有趣,哈哈。
猜你喜欢
  • 2014-08-13
  • 1970-01-01
  • 2011-11-15
  • 2014-09-05
  • 1970-01-01
  • 2018-05-16
  • 2013-11-14
  • 1970-01-01
  • 2015-11-25
相关资源
最近更新 更多