自定义分配器泄漏内存

时间:2013-05-10 22:33:29

标签: c++ visual-c++ memory-management visual-studio-2012

因此我的自定义分配器的实现有一个带有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所以我永远不会释放内存池中的内存。任何想法都将不胜感激。

1 个答案:

答案 0 :(得分:2)

来自有效STL

  

使分配器成为模板,模板参数T表示要为其分配内存的对象类型。

满意

  

提供typedef指针和引用,但始终指针为T *,引用为T&amp;。

满意

  

永远不要给你的分配器每个对象状态。通常,分配器应该没有非静态数据成员。

不满意,你的私人会员在你的分配器中!

  

请记住,分配器的分配成员函数是通过的   需要内存的对象数,而不是数量   需要的字节数还记得这些函数返回T *指针Ma   指针typedef),即使还没有T对象   构造

满意

  

请务必提供符合标准的嵌套重新绑定模板   容器依赖。

满意

所以删除你的私人会员......