C++ 自定义分配器泄漏内存

C++ 自定义分配器泄漏内存,c++,visual-c++,memory-management,visual-studio-2012,C++,Visual C++,Memory Management,Visual Studio 2012,因此,我的自定义分配器的实现有一个基类,它有两个静态变量,一个用于跟踪分配器的实例,另一个是内存池 template <typename T> class Allocator : public Base_Allocator { public: // Required types typedef T value_type; typedef size_t size_type; typedef ptrdiff_t difference_t

因此,我的自定义分配器的实现有一个基类,它有两个静态变量,一个用于跟踪分配器的实例,另一个是内存池

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; }

};

我的问题是记忆永远不会被释放。我将它传递给一个转发列表,这个转发列表创建了3个分配器,但它也删除了3个。这就是我让基类只在小于0时释放内存的原因。但事情并不是很顺利-1从未到达,因此我从未释放MemoryPool中的内存。任何想法都将不胜感激。

来自有效STL

将分配器设置为模板,模板参数T表示要为其分配内存的对象的类型

满意的

提供typedefs指针和引用,但指针始终为T*,引用始终为T&

满意的

不要为每个对象状态指定分配器。通常,分配器不应有非静态数据成员

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

请记住,分配器的allocate成员函数是通过 需要内存的对象数,而不是 需要的字节数。还要记住,这些函数返回T*指针Ma 指针类型定义),即使尚未创建任何T对象 建造的

满意的

确保提供嵌套的重新绑定模板,该模板基于哪个标准 容器取决于

满意的


因此,删除您的私有成员…

我从您的代码中删除了
MemoryPool..
部分,并使用gcc-4.8对其进行了良好的编译。也许这是一个VS问题。我不确定,因为我没有测试整个代码。但您可以在unix机器上试一试。
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;