2015-09-23 15 views
8

Próbuję wprowadzić std::vector jako ćwiczenie programistyczne.Poprawnie przydzielić pamięć w wektorze

Rozważmy następujący fragment kodu:

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 ma typ T*. Potrzebuję przydzielić pamięć przy użyciu std::allocator_traits<allocator_type>::allocate(m_alloc, m_capacity), która zwraca std::allocator_traits<allocator_type>::pointer.

Mogę przypuszczać, że pointer można niejawnie rzutować na T* i przypisać wartość zwracaną z allocate do m_data?

Jeśli nie, jak poprawnie przydzielić pamięć w vector?

+0

Można utworzyć własny program przydzielania. –

+0

Powiązane: http://stackoverflow.com/q/28521203/ – dyp

Odpowiedz

7

Powinieneś uczynić swój m_data członkiem jako Allocator::pointer. (Powinieneś prawdopodobnie utworzyć lokalny alias tego typu w swoim wektorze, jeśli chcesz używać standardowego interfejsu.)

Ten typ istnieje, ponieważ niektóre podzielniki nie mają do czynienia z surowymi wskaźnikami, takimi jak udostępniony Boost.Interprocess alokator pamięci, który może wykorzystywać inteligentne wskaźniki w zależności od konfiguracji.

+0

Jeśli zdefiniuję 'm_data' jako' Alokator :: wskaźnik', co powinno zwrócić funkcja 'std :: vector :: data()'? Jego typem powrotu jest 'T *'. – Hrant

+0

@Hrant Powinieneś zwrócić 'std :: addressof (* m_data)' –

Powiązane problemy