我正在尝试使用自定义删除器创建一个std::shared_ptr
,在该删除器中,控制块的分配与该对象本身之一相连。
不能使用接受自定义删除器的std::shared_ptr
的构造函数,因为这会导致对控制块本身的另一种分配:
std::shared_ptr<int> ptr(new int(0), [] (int*) {
// ...
});
我进一步来到std::allocate_shared
,以便为控制块和对象提供自定义分配器:
template <typename Object>
class my_allocator {
public:
using value_type = Object;
template <typename O>
explicit my_allocator(my_allocator<O> const& other) {
}
Object* allocate(std::size_t n, const void* hint = nullptr) {
assert(n == 1U);
return static_cast<value_type*>(::operator new(sizeof(value_type)));
}
void deallocate(Object* p, std::size_t n) {
assert(n == 1U);
// My problem occurs here, the allocator is rebound to
// an internal type provided by the standard library and
// the actual pointer to the int can't be retrieved anymore.
// The pointer can't be stored inside the allocator because it is
// rebound to some internal type before allocation.
}
};
// ...
using Object = int;
auto object = std::allocate_shared<Object>(my_allocator<Object>{},
std::forward<Args>(args)...);
这里的问题是,只能控制连接的控制块的分配和释放,但无法提供我想用来延迟对象的实际删除的自定义删除器。
是否可以使用自定义删除器,但只有一个联合分配?