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;