给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
Given a pointer to heap allocated memory, how do smart pointer implementations find the appropriate deallocation function for it?
为了练习,我正在尝试在C++中构建一个自定义智能指针库。
现在,我想,这个小项目会很容易,只需有一个指针列表,另一个每个指针的引用数列表,以及一个智能指针类来封装所有这些性感的功能。
嗯,不,当然没那么简单,我很快就遇到了一个问题。给定一个指向堆分配内存的任意指针,我如何编写我的类,以便它以某种方式在某个时候找到用于该指针的正确取消分配函数(new -> delete、new[] -> delete[]、malloc/realloc -> free 等(
除此之外,还有一个问题是我是否可以假设这个去分配函数只会接受争论,这感觉就像一个不安全的假设,因为上帝只知道可能有一个双参数去分配函数隐藏在我使用的某些库中。
我可以通过创建一个抽象类来解决这个问题,然后要求我的库的用户在我的智能指针实现中仅使用从它派生的类,但这感觉很恶心,坦率地说没有启发性。
我已经寻找了一段时间,我根本找不到合适的答案。因此,我在这里问你们中的一个人是否可以向我解释实际的智能指针实现如何解决这个问题,他们如何处理这些问题?他们甚至打扰吗?
标准库中的智能指针不会尝试神奇地确定适当的释放函数。他们希望提供一个,作为模板参数(std::unique_ptr(或在运行时,例如作为构造函数参数(std::shared_ptr(。如果未指定删除器,则指向非数组类型的指针的默认值为delete
,数组的默认值为delete[]
(如std::unique_ptr<int[]>
中所示(。
另请参阅:std::default_delete
相关文章:
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- Qt中的实现指针(PIMPL)
- 如何实现容纳整数和无效指针的双向链表?
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 使用共享指针实现复制 c'tor?
- C++ 线程函数指针实现返回错误无效使用非静态成员函数
- 智能指针实现的隐式强制转换
- 为什么C++lambda是用函子而不是函数指针实现的
- 代码中的智能指针实现错误
- 使用指针实现双链表C++
- 函数指针实现的两种方法之间的差异
- 我们可以用一个指针实现一个双链表吗
- 如何利用智能指针实现单链表的复制构造函数
- C /c++数据类型,通过指针实现最快的可移植访问
- C++ 使用智能指针实现链表 - 'head'未在此范围内声明
- 多重继承和指针实现
- 使用指向数组的指针实现无限大小的堆栈
- 通过引用CUDA指针实现CUDA矩阵反转
- 具有引用计数的共享智能指针实现
- 智能指针实现:何时为 pointee 调用析构函数