2013-05-10 108 views
0

因此,我的自定義分配器的實現有一個包含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永遠不會到達,所以我永遠不會釋放內存中的內存。任何想法,將不勝感激。

+0

我從你的代碼中刪除了'MemoryPool..'部分,它編譯罰款與GCC-4.8。也許這是一個VS問題。我不確定,因爲我沒有測試整個代碼。但是你可以在unix機器上給它一個鏡頭。 – stardust 2013-05-10 22:54:03

回答

2

有效STL

讓你分配一個模板,與代表要爲其分配內存的對象類型的模板參數T。

滿意

提供所述的typedef指針和引用,但總是具有指針是T *和參考爲T &。

滿意

永遠不要放棄你的分配器每對象狀態。一般來說,分配器應該沒有非靜態數據成員。

不滿意,您在您的分配器中有私人成員!

記住,一個分配器的分配成員函數被傳遞的 數目的對象針對其所需的存儲器,而不是所需要 字節數。還要記住,這些函數返回T *指針Ma 指針typedef),即使沒有T對象尚未被構造, 。

滿意

請務必提供在其標準 容器取決於嵌套重新綁定模板。

滿意

所以刪除烏爾私有成員......