自定义分配器泄漏内存

问题描述:

因此,我的自定义分配器的实现有一个包含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

有效STL

让你分配一个模板,与代表要为其分配内存的对象类型的模板参数T。

满意

提供所述的typedef指针和引用,但总是具有指针是T *和参考为T &。

满意

永远不要放弃你的分配器每对象状态。一般来说,分配器应该没有非静态数据成员。

不满意,您在您的分配器中有私人成员!

记住,一个分配器的分配成员函数被传递的 数目的对象针对其所需的存储器,而不是所需要 字节数。还要记住,这些函数返回T *指针Ma 指针typedef),即使没有T对象尚未被构造, 。

满意

请务必提供在其标准 容器取决于嵌套重新绑定模板。

满意

所以删除乌尔私有成员......