Tak mám tady zase problém, tentokrát ultra.
Při řešení jednoho projektu potřebuji zjistit výpisy alokace a uvolňování paměti kontejnerama vector. Knihovna STL samozřejmě definuje alokátor který můžeme přepsat a podstrčit ho kontejnerům. Až po taď je vše v pohodě. Vektoru sem podstrčil vlastní alokátor a krásně šlapal ALE. Já ve skutečnosti mám vektory v kterých sou další vektory, a u všech potřebuji mít vlastní alokátor. INU vrhl sem se nato a vznikla skutečně nechutná šablonová SR**KA. Bohužel, furt to na mne křičí errory, které sou však mírně nepochopitelné, jako ostatně celá vnitřní implementace STL....
#include <vector>
#include <iostream>
using namespace std;
template <typename T>
class debugAllocator: public std::allocator<T>
{
public:
typedef size_t size_type;
typedef T* pointer;
typedef const T* const_pointer;
template<typename _Tp1>
struct rebind
{
typedef debugAllocator<_Tp1> other;
};
pointer allocate(size_type n, const void *hint=0)
{
cout << "Alokuji \t" << sizeof(n) * n << " bajtu na adrese ";
auto temp = std::allocator<T>::allocate(n, hint);
cout << hex << long(temp) << dec << "[" << long(temp) << "]" << endl;
return temp;
}
void deallocate(pointer p, size_type n)
{
cout << "Uvolnuji \t" << sizeof(n)*n << " bajtu na adrese " << hex << long(p) << dec << "[" << long(p) << "]" << endl;
return std::allocator<T>::deallocate(p, n);
}
debugAllocator() throw(): std::allocator<T>()
{}
debugAllocator(const debugAllocator &a) throw(): std::allocator<T>(a) { }
~debugAllocator() throw() { }
};
int main()
{
vector<vector<bool,debugAllocator<bool>>,debugAllocator<vector<bool,debugAllocator<bool>>>>
vect(0,vector<bool,debugAllocator<bool>>(),debugAllocator<vector<bool,debugAllocator<bool>>>());
return 0;
}