【发布时间】:2012-12-16 01:51:24
【问题描述】:
我注意到,当我使用 std::shared_ptr(或任何其他智能指针)时,自定义分配器/删除器是通过 ctor 分配的,它恰好是一个模板。我的问题是:分配器/删除器是如何存储和使用的?
这些函子是存储为函数指针void* 还是什么?是间接调用还是直接调用?
为了更清楚地了解我要问的内容,请考虑以下代码:
struct SomethingAwesomeDeleter
{
public:
void operator()(SomethingAwesome* ptr) const
{
// do something awesome
delete ptr;
}
};
typedef std::shared_ptr<SomethingAwesome> SomethingAwesomePtr;
SomethingAwesomePtr ptr{new SomethingAwesome, SomethingAwesomeDeleter{}};
SomethingAwesomeDeleter{}是如何存储和使用的?
注意:
我确实意识到std::shared_ptr 是一个模板类,但是std::shared_ptr 在类模板参数中没有删除器/分配器的模板参数,即没有像std::shared_ptr<T, Allocator, Deleter> 这样的模板类。
【问题讨论】:
-
没有你描述的这样的模板类decl,你是对的。但是对于
shared_ptr构造函数,是这样的模板覆盖(对于shared_ptr,有一个constructor overrides 的boatload)。关于存储,我想它是实现定义的,但我见过的大多数实现将它们存储为 shared_ptr 的实例成员或类似的东西。我可能(并且可能)错了,因为我不熟悉标准是否规定了所述对象的实际存储细节。