C++ 查找池分配器中内存泄漏的原因

C++ 查找池分配器中内存泄漏的原因,c++,memory-management,memory-leaks,C++,Memory Management,Memory Leaks,我有一个自定义内存池,我正在尝试使用STL容器,并且我正在使用std::allocator模板作为实现的包装器。我很难找到Valgrind报告的内存泄漏的原因 我将分配器模板设置为: template <class T> class pool_allocator { public: typedef T value_type; typedef value_type* pointer;

我有一个自定义内存池,我正在尝试使用STL容器,并且我正在使用std::allocator模板作为实现的包装器。我很难找到Valgrind报告的内存泄漏的原因

我将分配器模板设置为:

    template <class T> class pool_allocator
    {
    public:
        typedef T                 value_type;
        typedef value_type*       pointer;
        typedef const value_type* const_pointer;
        typedef value_type&       reference;
        typedef const value_type& const_reference;
        typedef std::size_t       size_type;
        typedef std::ptrdiff_t    difference_type;

        template <class U>
        pool_allocator(const pool_allocator<U>&) {}

        template <class U>
        struct rebind
        {
            typedef pool_allocator<U> other;
        };

        pool_allocator(size_type blocks,
                          size_type size_of_each_block=sizeof(T)) :
                          _pool(new MyPool<T>())
        {
            _pool->create_pool(blocks, size_of_each_block);
        }

        ... etc.

   private:
        MyPool<T>* _my_pool;

        ... etc.
~pool_allocator()
{
    _my_pool->~MyPool();
}
Valgrind报告了如下问题:

InvalidRead|====|Invalid read of size 8|
||Call stack:|
/home/matt/Documents/C++/Pool/include/MyPool.h|19|0x400E34: MyPool<A>::~MyPool()|
/home/matt/Documents/C++/Pool/include/pool_allocator.h|40|0x400CB4: pool_allocator<A>::~pool_allocator()|
/home/matt/Documents/C++/Pool/main.cpp|19|0x400B55: main|
||Address 0x5ab5ca0 is 32 bytes inside a block of size 48 free'd|
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so||0x4C2F24B: operator delete(void*)|
/home/matt/Documents/C++/Pool/include/pool_allocator.h|40|0x400CBC: pool_allocator<A>::~pool_allocator()|
/usr/include/c++/5/bits/stl_vector.h|79|0x400E73: std::_Vector_base<A, pool_allocator<A> >::_Vector_impl::~_Vector_impl()|
/usr/include/c++/5/bits/stl_vector.h|161|0x400F35: std::_Vector_base<A, pool_allocator<A> >::~_Vector_base()|
/usr/include/c++/5/bits/stl_vector.h|425|0x400D69: std::vector<A, pool_allocator<A> >::~vector()|
/home/matt/Documents/C++/Pool/main.cpp|20|0x400B49: main|
InvalidWrite|====|Invalid write of size 8|

etc.
Valgrind报告:

Leak_DefinitelyLost|====|48 bytes in 1 blocks are definitely lost in loss record 1 of 2|
||Call stack:|
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so||0x4C2E0EF: operator new(unsigned long)|
/home/matt/Documents/C++/Pool/include/pool_allocator.h|28|0x400C0E: pool_allocator<A>::pool_allocator(unsigned long, unsigned long)|
/home/matt/Documents/C++/Pool/main.cpp|19|0x400AD3: main|
||Valgrind found 1 errors!|
Leak_DefinitelyLost |==| 1个块中的48字节在丢失记录1(共2个)中肯定丢失|
||调用堆栈:|
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so | | | 0x4C2E0EF:运算符新(无符号长)|
/home/matt/Documents/C++/Pool/include/Pool|u allocator.h | 28 | 0x400C0E:Pool_allocator::Pool_allocator(无符号长,无符号长)|
/home/matt/Documents/C++/Pool/main.cpp | 19 | 0x400AD3:main|
||Valgrind发现了1个错误|
看起来MyPool内部缓冲区已被适当释放,但MyPool内部的成员数据(总是大小为48字节)已被泄漏


我应该如何重写这些析构函数,以便按正确的顺序释放所有内容?

。您尚未提供复制构造函数或赋值运算符。编译器生成的实例只是复制
\u pool
指针,因此您最终会看到多个实例认为它们拥有相同的
MyPool
,所有实例都试图销毁它。@IgorTandetnik谢谢。我的主函数只是创建了一个
pool\u分配器的实例,然后创建了一个特定大小的
std::vector
。因此,当实例被交给向量的构造函数时,会调用池分配程序的复制构造函数吗?当然,您不会显示
\u池的声明。Vector需要复制分配器,以便在内部存储。Vector构造函数通过常量引用获取分配器;不要离开那。此外,分配器必须是可复制的。。您尚未提供复制构造函数或赋值运算符。编译器生成的实例只是复制
\u pool
指针,因此您最终会看到多个实例认为它们拥有相同的
MyPool
,所有实例都试图销毁它。@IgorTandetnik谢谢。我的主函数只是创建了一个
pool\u分配器的实例,然后创建了一个特定大小的
std::vector
。因此,当实例被交给向量的构造函数时,会调用池分配程序的复制构造函数吗?当然,您不会显示
\u池的声明。Vector需要复制分配器,以便在内部存储。Vector构造函数通过常量引用获取分配器;不要离开那。此外,分配器必须是可复制的。
~pool_allocator()
{
    _my_pool->~MyPool();
}
Leak_DefinitelyLost|====|48 bytes in 1 blocks are definitely lost in loss record 1 of 2|
||Call stack:|
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so||0x4C2E0EF: operator new(unsigned long)|
/home/matt/Documents/C++/Pool/include/pool_allocator.h|28|0x400C0E: pool_allocator<A>::pool_allocator(unsigned long, unsigned long)|
/home/matt/Documents/C++/Pool/main.cpp|19|0x400AD3: main|
||Valgrind found 1 errors!|