Кастомный аллокатор под кучу c++

Max

Добрый день! Пронаследовал класс аллокатора для использования HeapAlloc в качестве источника выделяемой памяти. Проблема заключается в следующем: последующие, начиная со второго, выделения памяти завершаются исключением типа access violatuion. Вот код:

#define NOMINMAX
#include <windows.h>
#include <memory>
#include <iostream>
#include <limits>
#include <sstream>
template<class t="">
class HeapAllocator
{
private :
    HANDLE hHeap;
    size_t size;
public:
    using value_type = T;
    using Traits = std::allocator_traits<heapallocator<t>>;
    using size_type = std::size_t;
    using difference_type = std::ptrdiff_t;
    using pointer = T*;
    using const_pointer = const T *;
    using reference = T &;
    using const_reference = const T &;
    T * allocate(std::size_t n);
    pointer address(reference value) const { return  &value; }
    const_pointer address(const_reference value) const { return &value; }
    void deallocate(T * p, std::size_t n);
    size_type max_size() const  { return             std::numeric_limits<size_type>::max() / sizeof(T); }
    template<class u,="" class...="" args="">
    void construct(U* p, Args&&... args) { std::allocator<t>().construct(p,         std::forward<args>(args)...); }
    template<class u="">
    void destroy(U* p) { std::allocator<t>().destroy(p); }
    HeapAllocator();
    ~HeapAllocator();
    template<class u="">
    struct rebind 
    { 
        using other = HeapAllocator<u>;
    };
    template<class u="">
    HeapAllocator(const HeapAllocator<u> & other) {}
};
template<class t="">
HeapAllocator<t>::HeapAllocator()
{
    hHeap = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE|
               HEAP_NO_SERIALIZE,
                1024, 0);
}
template<class t="">
HeapAllocator<t>::~HeapAllocator()
{
    HeapDestroy(hHeap);
}
template<class t1,="" class="" t2="">
bool operator==(const HeapAllocator<t1> &, const HeapAllocator<t2> &)         throw()
{
    return true;
}
template <class t1,="" class="" t2="">
bool operator!=(const HeapAllocator<t1>&,
const HeapAllocator<t2>&) throw() {
    return false;
}
template<class t="">
T * HeapAllocator<t>::allocate(std::size_t n)
{
    void *p = nullptr;
     p = HeapAlloc(hHeap, 0, sizeof(T) * n);
    if (p == nullptr)
    std::cerr << GetLastError() << '\n';
    return reinterpret_cast<t *="">(p);
}
template<class t="">
void HeapAllocator<t>::deallocate(T *p, size_t n)
{
    HeapFree(hHeap, 0, p);
}
</t></class></t></t></class></t2></t1></class></t2></t1></class></t></class></t></class></u></class></u></class></t></class></args></t></class></size_type></heapallocator<t></class></sstream></limits></iostream></memory></windows.h>
1 ответ

Max

Не вдаваясь в детали... при копировании или присвоении hHeap становится недействительным, ибо в деструкторе вызывается HeapDestroy(hHeap);.

При любом уничтожении любой копии получается масса неприятностей.

licensed under cc by-sa 3.0 with attribution.