2012-12-10 19 views
20
buffer = new char[64]; 
buffer = std::make_shared<char>(char[64]); ??? 

Czy można przydzielić pamięć do tablicy przy użyciu make_shared<>()?Czy możesz przydzielić tablicę z czymś podobnym do make_shared?

mogłem zrobić: buffer = std::make_shared<char>(new char[64]);

Ale to nadal wiąże nazywając nowy, to w moim rozumieniu make_shared jest bezpieczniejszy i bardziej wydajny.

+3

'std :: vector bufor (64); ' –

Odpowiedz

19

Punktem make_shared jest włączenie zarządzanego obiektu do bloku sterującego wspólnego wskaźnika,

Ponieważ masz do czynienia z C++ 11, być może przy użyciu C++ 11 tablicę by spełnić swoje cele ?

#include <memory> 
#include <array> 
int main() 
{ 
    auto buffer = std::make_shared<std::array<char, 64>>(); 
} 

Należy pamiętać, że nie można korzystać z udostępnionego namiaru samo jak wskaźnik można dostać od nowa [], ponieważ std::shared_ptr (w przeciwieństwie std::unique_ptr, na przykład) nie dostarcza operator[]. Musisz go usunąć: (*buffer)[n] = 'a';

+0

Dlaczego tak, tak by było. Nigdy nie przestaję uczyć się nowych sztuczek w C++ 11 ... –

+0

Nie mogę jednak określić rozmiaru tablicy w czasie kompilacji? –

+2

@JoshElias Na pewno można w czasie kompilacji. Masz na myśli runtime? Wymagałoby to twojej własnej klasy, która przyjmuje rozmiar tablicy jako argument konstruktora, ponieważ 'make_shared ' przekazuje swoje argumenty środowiska wykonawczego do konstruktora 'T'. Lub po prostu utwórz wspólny wektor. – Cubbi

1

Co powiesz na to?

template<typename T> 
inline std::shared_ptr<T> MakeArray(int size) 
{ 
    return std::shared_ptr<T>(new T[size], [](T *p){ delete [] p; }); 
} 

auto buffer = new char[64]; 
auto buffer = MakeArray<char>(64); 
+0

Istnieje różnica między tworzeniem nowego 'shared_ptr' i używanie' make_shared', później ma 1 mniej operacji atomowej i jest preferowany, gdy tylko jest to możliwe. – SagiLow

2

Czy potrzebujesz udostępnionej pamięci? Można użyć std::unique_ptr zamiast a std::make_unique dostępny na C++ 14:

auto buffer = std::make_unique<char[]>(64); 

Będzie std::make_shared wersja dostępna w C++ 20:

auto buffer = std::make_shared<char[]>(64);