Problém s vlastním alokátorem – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém s vlastním alokátorem – C / C++ – Fórum – Programujte.comProblém s vlastním alokátorem – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Sefiros0
Návštěvník
10. 2. 2014   #1
-
0
-

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;
}
Nahlásit jako SPAM
IP: 80.188.252.–
vitamin+8
Grafoman
11. 2. 2014   #2
-
0
-

#1 Sefiros
vector ma specializaciu na typ 'bool'. Vtedy sa zrejme pouziva allocator inak ako v standartnom pripade. Akonahle zmenis typ bool za nieco ine tak ti to bude fungovat.

Ak mas c++11 kompilator tak mozes pouzit nieco taketo aby to bolo viac prehladne:

template <class T>
using dbg_vector = std::vector<T, debugAllocator<T>>;

int main()
{
    dbg_vector<dbg_vector<int>> vect(
        0,
        dbg_vector<int>{},
        debugAllocator<dbg_vector<int>>{}
    );

    return 0;
}
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Seph
~ Anonymní uživatel
37 příspěvků
11. 2. 2014   #3
-
0
-

Hele, nefunguje... At použiju jakýkoli datovi typ.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 80.250.14.–
vitamin+8
Grafoman
11. 2. 2014   #4
-
0
-

co ti vypisuje?

Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Seph
~ Anonymní uživatel
37 příspěvků
11. 2. 2014   #5
-
0
-

Spoooustu errorů. Není to jen jeden error. Nechci bejt drzej, ale tys to nezkusil spustit? Vono todle není tak lehký aby stačilo radit od stolu no. STL je vnitřně fakt divočina, na první pohled je to prostě správně, a je fuk jestli tam dám bool a nebo string. Ono je to ale prostě blbě ať tam dám cokoli. Zajímavé ale je, že když udělám vektor s vlastním alokátorem který ukládá vektory s implicitním alokátorem, vše je OK. Jakmile se ale pokusím přidat svůj alokátor i vnořeným vektorům, je zle. To je na tom zajímevé. A taky když vytovřím obyčejnej vektor s vlastním alokátorem a použiju na něj konstruktor keterej bere jen objekt alokátoru, nemůžu použít metodu push_back(), prej neexistuje. KDyž však použiju konstruktor vector<>(lenght,Value,Allocator), vše funguje jak má. Todle je prostě hackování STL ...

Nahlásit jako SPAM
IP: 80.188.252.–
11. 2. 2014   #6
-
0
-

Aspoň prvních pár chyb bys vypsat mohl. Jinak je to věštění z křišťálové koule a to tady nikdo neumí. Nebylo by od věci abys i uvedl jaký překladač a v jaké verzi používáš. Nemusí mít implementováno vše z C++11 nebo dokonce vůbec nic - i to může být příčina chyb.

Z prvních 3 vět mám pocit, že bys potřeboval spíš kopnout do prdele než poradit.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Řešení
vitamin+8
Grafoman
11. 2. 2014   #7
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

#5 Seph
Mne to funguje:

#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<int,debugAllocator<int>>,debugAllocator<vector<int,debugAllocator<int>>>> vect(
	0,
	vector<int,debugAllocator<int>>(),
	debugAllocator<vector<int,debugAllocator<int>>>()
    );
	
    vect.push_back({});
    for(int i = 0; i < 10; ++i)vect.back().push_back(i);
    return 0;
}

vystup mam takyto:

Alokuji 	8 bajtu na adrese 1cca010[30187536]
Alokuji 	8 bajtu na adrese 1cca030[30187568]
Alokuji 	16 bajtu na adrese 1cca050[30187600]
Uvolnuji 	8 bajtu na adrese 1cca030[30187568]
Alokuji 	32 bajtu na adrese 1cca030[30187568]
Uvolnuji 	16 bajtu na adrese 1cca050[30187600]
Alokuji 	64 bajtu na adrese 1cca070[30187632]
Uvolnuji 	32 bajtu na adrese 1cca030[30187568]
Alokuji 	128 bajtu na adrese 1cca0a0[30187680]
Uvolnuji 	64 bajtu na adrese 1cca070[30187632]
Uvolnuji 	128 bajtu na adrese 1cca0a0[30187680]
Uvolnuji 	8 bajtu na adrese 1cca010[30187536]

edit:

throw-list je v C++11 deprecated, miesto throw() sa pouziva noexcept.

Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Seph
~ Anonymní uživatel
37 příspěvků
12. 2. 2014   #8
-
0
-

Používám gcc jež ma implementovane c++11. Verzi ti nepovím, píšu z mobilu. Jo a k tomu nakopnutí do prdele...nevím jakou jinou reakci bys čekal. Asi tě to urazilo, ale mne zas nakrklo že někdo svým přístupem bagatelizuje problém. Bejt to blbé lezení za pole. Nic neřeknu. To skutečně není problém zanalizovat bez pokusu o kompilaci. Todle je ale trochu něco jiného. Jo a vytrvale mi to hází errory, zřejmě způsobené neaktualitou GCC...abych řekl pravdu, je rychlejší si napsat vlastní kontejner než se srat s alokatorama.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 80.188.252.–
12. 2. 2014   #9
-
0
-

Nikdy jsem neměl pocit, že by vitamin bagatelizoval problém. Vždy se snažil poradit. Je třeba si uvědomit, že když to rádce zkompiluje na jiném překladači, ještě to neznamená, že to bude funkční na tebou používaném. Už jsem mockrát narazil na problém přenositelnosti kódu mezi překladači a mezi verzemi téhož překladače. 

hu

Nahlásit jako SPAM
IP: 195.178.67.–
RePRO0
Super člen
12. 2. 2014   #10
-
0
-

Zdravím,

snaží se ti zde poradit největší bouráci (vitamin a hlucheucho) z problematiky vývoje tady na serveru programujte.com a spíše mám takový pocit, že se neumíš dobře postavit k problému. Mimochodem přenositelnost překladačů je velmi známý pojem. Až se vyřeší u tebe ta přenositelnost, tedy půjde to nahodit, tak máš vyhráno. Jiný problém doposud nevidím.

Nahlásit jako SPAM
IP: 95.82.185.–
Software: C; C++; C#; Pascal; Delphi; Java Webdesign: PHP; MySQL; CSS; jQuery; Ajax; Javascript; OOP
Sefiros0
Návštěvník
12. 2. 2014   #11
-
0
-

budiž, tak to na mne působilo. Ale konec konců, je to jedno. PRoblém nyní neexistuje.

Nahlásit jako SPAM
IP: 80.188.252.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 5 hostů

Podobná vlákna

Problém — založil Jano

Problem — založil roonill

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý