我創造了我自己的分配器像這樣:爲什麼不從繼承的std ::分配器
template<typename T>
class BasicAllocator
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef T value_type;
BasicAllocator() throw() {};
BasicAllocator (const BasicAllocator& other) throw() {};
template<typename U>
BasicAllocator (const BasicAllocator<U>& other) throw() {};
template<typename U>
BasicAllocator& operator = (const BasicAllocator<U>& other) {return *this;}
BasicAllocator<T>& operator = (const BasicAllocator& other) {return *this;}
~BasicAllocator() {}
pointer address (reference value) const {return &value;}
const_pointer address (const_reference value) const {return &value;}
pointer allocate (size_type n, const void* hint = 0) {return static_cast<pointer> (::operator new (n * sizeof (value_type)));}
void deallocate (void* ptr, size_type n) {::operator delete (static_cast<T*> (ptr));}
template<typename U, typename... Args>
void construct (U* ptr, Args&& ... args) {::new (static_cast<void*> (ptr)) U (std::forward<Args> (args)...);}
void construct (pointer ptr, const T& val) {new (static_cast<T*> (ptr)) T (val);}
template<typename U>
void destroy (U* ptr) {ptr->~U();}
void destroy (pointer ptr) {ptr->~T();}
size_type max_size() const {return std::numeric_limits<std::size_t>::max()/sizeof (T);} /**return std::size_t(-1);**/
template<typename U>
struct rebind
{
typedef BasicAllocator<U> other;
};
};
但我想知道爲什麼我不應該從std::allocator
繼承。是因爲它沒有虛擬析構函數嗎?我見過很多帖子說應該創建自己的而不是繼承。我明白爲什麼我們不應該繼承std::string
和std::vector
,但繼承std::allocator
有什麼問題?
我可以繼承我的課程嗎?或者我需要一個虛擬析構函數來做到這一點?
爲什麼?
'new(static_cast(ptr))'看起來像一個打字錯誤(該函數已經在使用'pointer == T *') –
dyp