【发布时间】: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