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

È possibile assegnare memoria a un array utilizzando make_shared<>()?Puoi allocare un array con qualcosa di equivalente a render_shared?

che potevo fare: buffer = std::make_shared<char>(new char[64]);

Ma questo comporta ancora chiamando nuovo, è la mia comprensione make_shared è più sicuro e più efficiente.

+3

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

risposta

19

Il punto di make_shared è quello di incorporare l'oggetto gestito nel blocco di controllo del puntatore condiviso,

Dal momento che hai a che fare con il C++ 11, magari utilizzando una matrice C++ 11 avrebbe soddisfatto i vostri obiettivi ?

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

Si noti che non è possibile utilizzare un puntatore condiviso allo stesso modo come un puntatore si otterrebbe da nuovo [], perché std::shared_ptr (a differenza std::unique_ptr, per esempio) non fornisce operator[]. Dovresti dereferenziarlo: (*buffer)[n] = 'a';

+0

Perché, sì, lo farebbe. Non smetto mai di imparare nuovi trucchi in C++ 11 ... –

+0

Non riesco a specificare la dimensione dell'array in fase di compilazione? –

+2

@JoshElias Puoi farlo al momento della compilazione. Intendi runtime? Ciò richiederebbe la tua classe che prende la dimensione dell'array come argomento del costruttore, poiché 'make_shared ' inoltra i suoi argomenti di runtime al costruttore di 'T'. O semplicemente fai un vettore condiviso. – Cubbi

1

Che ne dici di questo?

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

C'è una differenza tra la creazione di una nuova 'shared_ptr' e l'uso di' make_shared', la successiva ha 1 operazione atomica in meno ed è preferibile quando possibile. – SagiLow

2

È necessario condividere la memoria allocata? È possibile utilizzare un std::unique_ptr invece e il std::make_unique disponibili su C++ 14:

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

Ci sarà una versione std::make_shared disponibili in C++ 20:

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