2015-09-23 13 views
8

Sto tentando di implementare std::vector come esercizio di programmazione.Allocare correttamente memoria nel vettore

Si consideri il seguente frammento di codice:

template <class T, class Allocator = std::allocator<T>> 
class vector 
{ 
public: 
    using size_type = size_t; 
    using allocator_type = Allocator; 
    ... 
private: 
    T* m_data; 
    allocator_type m_alloc; 
    size_type m_capacity; 
    ... 
}; 

m_data è di tipo T*. Ho bisogno di allocare memoria usando std::allocator_traits<allocator_type>::allocate(m_alloc, m_capacity) che restituisce std::allocator_traits<allocator_type>::pointer.

Posso supporre che pointer può essere implicitamente in T* e assegnare il valore restituito allocate-m_data?

In caso negativo, come allocare correttamente la memoria in vector?

+0

È possibile creare il proprio allocatore. –

+0

Correlati: http://stackoverflow.com/q/28521203/ – dyp

risposta

7

È necessario creare un membro m_data e un Allocator::pointer. (Probabilmente dovresti creare un alias locale di quel tipo nel tuo vettore, se vuoi seguire l'interfaccia standard.)

Il tipo esiste perché alcuni allocatori non trattano i puntatori raw, come il Boost.Interprocess condiviso allocatore di memoria, che può utilizzare puntatori intelligenti a seconda della configurazione.

+0

Se definisco 'm_data' come' Allocator :: pointer', cosa deve restituire la funzione 'std :: vector :: data()'? Il suo tipo di ritorno è 'T *'. – Hrant

+0

@Hrant Si dovrebbe restituire 'std :: addressof (* m_data)' –