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 永远不会达到,所以我永远不会释放内存池中的内存。任何想法,将不胜感激。

4

1 回答 1

2

有效的 STL

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

使满意

提供 typedefs 指针和引用,但总是指针为 T*,引用为 T&。

使满意

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

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

请记住,分配器的分配成员函数传递的是需要内存的对象数,而不是所需的字节数。还要记住这些函数返回 T* 指针 Ma the pointer typedef),即使尚未构造 T 对象。

使满意

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

使满意

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

于 2013-05-10T23:04:43.073 回答