[英]Custom allocator leaking memory
因此,我的自定義分配器的實現有一個帶有2個靜態變量的基類,一個用於跟蹤分配器的實例,另一個用於內存池。
template <typename T>
class Allocator : public Base_Allocator
{
public:
// Required types
typedef T value_type;
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;
template <typename U>
struct rebind
{
typedef Allocator<U> other;
};
// Required Opeartions
explicit Allocator(void) : Base_Allocator()
{
}
~Allocator(void) { }
Allocator(const Allocator& a) : Base_Allocator()
{
} // copy constructor
pointer address(reference value) const { return &value; }
const_pointer address(const_reference value) const { return &value; }
size_type max_size(void) const { size_type m = 4096; return m; }
pointer allocate(size_type n)
{
return static_cast<value_type*>( Base_Allocator::m_pMemMngr->Alloc( sizeof(value_type) * n) );
}
void deallocate(pointer p, size_type n) {
Base_Allocator::m_pMemMngr->Free(p);
}
void construct(pointer p, const T& value) {
new((T*)p) T(value);
}
void destroy(pointer p) {
p->~T();
}
bool operator == (const Allocator& right) const { return true; }
bool operator != (const Allocator& right) const { return false; }
};
這是基類......
class Base_Allocator
{
public:
static int m_icount;
static MemoryManager* m_pMemMngr;
public:
Base_Allocator(void)
{
m_icount++;
if(!m_pMemMngr)
{
NEW(m_pMemMngr);
m_pMemMngr->Init();
}
}
~Base_Allocator(void)
{
m_icount--;
if(m_icount<0)
{
SAFE_DELETE(m_pMemMngr);
}
}
};
這是靜態成員的定義
#include "Base.h"
int Base_Allocator::m_icount = 0;
MemoryManager* Base_Allocator::m_pMemMngr = nullptr;
我的意思是永遠不會釋放內存。 我將它傳遞給forward_list,這個轉發列表創建了3個分配器,但它也刪除了3.這就是為什么我的基類只有在小於0時才釋放內存。但事情並沒有真正解決得太好。 永遠不會達到-1所以我永遠不會釋放內存池中的內存。 任何想法,將不勝感激。
從有效的STL
使分配器成為模板,模板參數T表示要為其分配內存的對象類型。
滿意
提供typedef指針和引用,但始終指針為T *,引用為T&。
滿意
永遠不要給你的分配器每個對象狀態。 通常,分配器應該沒有非靜態數據成員。
不滿意,你有私人成員在你的分配器!
請記住,分配器的分配成員函數傳遞的是需要內存的對象數,而不是所需的字節數。 還記得這些函數返回T *指針Ma指針typedef),即使還沒有構造T對象。
滿意
請務必提供標准容器所依賴的嵌套重新綁定模板。
滿意
所以刪除你的私人會員......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.