从std::allocate_shared in cppreference:allocate_shared是如何工作的?
构造
T
类型的对象,并使用args
作为用于T
构造函数的参数列表把它包装在std::shared_ptr
。该对象的构造方式如同使用表达式::new (pv) T(std::forward<Args>(args)...)
,其中pv
是内部void*
存储器指针,该存储器适用于容纳T
类型的对象。存储空间通常大于sizeof(T)
,以便为共享指针的控制块和对象使用一个分配。所有内存分配都使用
alloc
的副本完成,该副本必须满足Allocator
的要求。
什么让我迷惑的,想想以下用户定义的分配器,还从cppreference
template <class T>
struct Mallocator {
typedef T value_type;
Mallocator() = default;
template <class U> Mallocator(const Mallocator<U>&) {}
T* allocate(std::size_t n) { return static_cast<T*>(std::malloc(n * sizeof(T))); }
void deallocate(T* p, std::size_t) { std::free(p); }
};
template <class T, class U>
bool operator==(const Mallocator<T>&, const Mallocator<U>&) { return true; }
template <class T, class U>
bool operator!=(const Mallocator<T>&, const Mallocator<U>&) { return false; }
由于Mallocator
只能分配的sizeof(T)
内存,怎么可能allocate_shared
分配存储其中大于sizeof(T)
中为了共享指针的控制块和T
对象使用一个分配?
它可以分配2 * sizeof(T),但我不知道它是否真的这样做。 – immibis
@immibis T = char时可能不会奏效; – cdhowie