2015-10-27 10 views
5

Siamo spiacenti, non è possibile incollare il codice specifico.
Spero che questo piccolo esempio è sufficiente:Perché std :: list desidera chiamare il mio allocatore senza argomenti?

Diciamo che ho un allocatore come questo:

template <class T> 
class MyAllocator 
{ 
// ... typedefs 

    MyAllocObject _allocObject; 

public: 
    MyAllocator() { 
    // _allocObject = new .. 
    } 

    MyAllocator(const MyAllocator& alloc) { 
     _allocObject = alloc.getAllocObject(); 
    } 

    template <class U> 
    MyAllocator(const MyAllocator<U>& alloc) { 
     _allocObject = alloc.getAllocObject(); 
    } 

    MyAllocator(const MyAllocObject& allocObject) { 
     _allocObject = allocObject; 
    } 

    inline pointer allocate(size_type size) { 
     return _allocObject->alloc(size); 
    } 

// other functions 
}; 

ed è usato in questo modo:

MyAllocObject object; 
MyAllocator<int> myAlloc(object); 
std::list<int, MyAllocator<int> > list(myAlloc); 

ho sperimentato, che se il default manca il costruttore, il codice non viene compilato, quindi l'ho aggiunto.
Ma il problema è che io dipendo da quell'argomento, perché è quello che uso per le mie allocazioni di memoria personalizzate.

Cosa posso fare in questo caso?

+3

Prima di C++ 11, allocatori dovevano b come se fosse apolide, cioè due istanze dello stesso tipo, non importa come fossero intializzate, dovevano essere scambiabili. (Questo requisito deriva dallo spostamento di elementi da un contenitore a un altro) C++ 11 aggiunge il requisito per gli allocatori di stato. Prima del C++ 11, gli allocatori dovevano comportarsi come se fossero apolidi, cioè due istanze dello stesso tipo, indipendentemente da come erano intializzate, dovevano essere scambiabili. C++ 11 aggiunge il requisito per gli allocatori di stato: http://stackoverflow.com/questions/6861046/compiler-support-for-stateful-allocators-in-stl-containers – peterchen

+1

Con quale piattaforma, compilatore e opzioni stai lavorando? – Niall

+0

@Niall: volevo espandere un po 'prima di postare come risposta. Fatto :) - sfortunatamente, non sono riuscito a trovare una bella introduzione all'uso degli allocatori di stato. – peterchen

risposta

2

Prima del C++ 11, le implementazioni STL erano autorizzate a richiedere che gli allocatori si comportassero come se fossero privi di stato.

"comportarsi come-se stateless" significa STL poteva invocare seguenti operazioni per:

MyAllocator a1; 
void * p = a1.allocate(77, 0); 

MyAllocator a2; 
a2.free(p); 

(IIRC questo semplifica attuazione di alcune operazioni del contenitore.)

"è stato permesso di richiede "" significa implementazione STL potrebbe supportare gli allocatori di stato (come il tuo), ma non è necessario.


C++ 11 richiede il supporto per gli allocatori di stato.
Non ho potuto, tuttavia, trovare una rapida introduzione a questo (qualcuno vuole aggiungerlo?) This thread might give you some leads.


Se si sono tenuti a un particolare compilatore che non supporta allocatori stateful, avete alcune opzioni non-così-lucidi:

  • includere un riferimento al vostro stato come modello argomento del allocatore
  • nella vostra allocazione, includono un back-link per l'allocatore in questione (di solito distrugge lo scopo di un allocatore personalizzato per i piccoli dei dati)
Problemi correlati