簡體   English   中英

自定義分配器泄漏內存

[英]Custom allocator leaking memory

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

有效的STL

使分配器成為模板,模板參數T表示要為其分配內存的對象類型。

滿意

提供typedef指針和引用,但始終指針為T *,引用為T&。

滿意

永遠不要給你的分配器每個對象狀態。 通常,分配器應該沒有非靜態數據成員。

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

請記住,分配器的分配成員函數傳遞的是需要內存的對象數,而不是所需的字節數。 還記得這些函數返回T *指針Ma指針typedef),即使還沒有構造T對象。

滿意

請務必提供標准容器所依賴的嵌套重新綁定模板。

滿意

所以刪除你的私人會員......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM