2009-11-11 18 views
13

Il numero boost::make_shared è obsoleto? Non ho trovato la sua definizione in 1.35.boost :: make_shared è ora obsoleto?

+1

Ironicamente la maggior parte delle persone che vengono qui ora si starà probabilmente chiedendo (come me) se è obsoleta perché è in C++ 11. (Risposta breve: sì, puoi usare std :: versions.) – patrickvacek

+0

... a meno che non sia necessario mantenere la compatibilità con le piattaforme pre-C++ 11, nel qual caso i puntatori intelligenti di Boost sono un vantaggio * veramente * buono. – DevSolar

risposta

12

la sua nel 1.4 docs: http://www.boost.org/doc/libs/1_40_0/libs/smart_ptr/make_shared.html

Sembra che sia stato aggiunto nella versione 1.39

+0

Grazie Ryan. C'è un modo per scoprire quale versione è stata introdotta? – Steve

+0

Il documento smart_ptr ha una sezione di cronologia che può aiutarti a trovare quello che ti serve: http://www.boost.org/doc/libs/1_40_0/libs/smart_ptr/smart_ptr.htm#History –

+7

è anche parte di C++ 0x –

2

ha fatto un po 'di ricerca oggi, e sembra che make_shared in realtà è stato aggiunto al 1.36.0 (a 1.35 .0 non c'è una tale intestazione), ma la cosa interessante è che non c'è una singola menzione in Novità su questo cambiamento - almeno non l'ho trovato

26

std :: make_shared è anche disponibile in C++ 11 . Si noti che make_shared è più di una funzione di convenienza. Nel seguente esempio:

make_shared<foobar>(1, 2); 
shared_ptr<foobar>(new foobar(1, 2)); 

Entrambe le affermazioni creare un oggetto foobar e costruire una shared_ptr. Tuttavia, il primo evita un'allocazione di memoria per il contatore condiviso, poiché verrà utilizzato un singolo blocco di memoria per il contatore e l'oggetto foobar. Questo non è possibile con quest'ultima affermazione, perché la memoria di foobar viene allocata prima che venga costruita la shared_ptr.

Che cosa voglio dire: No, make_shared non è obsoleto, perché fornisce un'ottimizzazione molto utile.

+7

In C++ 11, '' std :: make_shared'' è in realtà una ottimizzazione delle prestazioni rispetto alla creazione di un oggetto, quindi alla creazione di '' std :: shared_ptr'', perché esegue solo una allocazione di memoria anziché due. – Sean

+2

Un'altra importante differenza è la sicurezza del filo. Nel secondo esempio, 'shared_ptr' 'può lanciare ctor mentre il foobar assegnato da nested new non verrà rilasciato. –

Problemi correlati