自定义分配器泄漏内存
问题描述:
因此,我的自定义分配器的实现有一个包含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对象尚未被构造, 。
满意
请务必提供在其标准 容器取决于嵌套重新绑定模板。
满意
所以删除乌尔私有成员......
我从你的代码中删除了'MemoryPool..'部分,它编译罚款与GCC-4.8。也许这是一个VS问题。我不确定,因为我没有测试整个代码。但是你可以在unix机器上给它一个镜头。 – stardust 2013-05-10 22:54:03