Il numero boost::make_shared
è obsoleto? Non ho trovato la sua definizione in 1.35.boost :: make_shared è ora obsoleto?
risposta
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
Grazie Ryan. C'è un modo per scoprire quale versione è stata introdotta? – Steve
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 –
è anche parte di C++ 0x –
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
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.
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
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. –
- 1. 'make_shared' è ambigua
- 2. Un 'typedef' per una funzione template (boost :: make_shared)
- 3. CookieSyncManager è ora obsoleto, cosa posso invece utilizzare?
- 4. GKSession è obsoleto in iOS7, cosa devo usare ora?
- 5. Posso usare boost :: make_shared con un costruttore privato?
- 6. boost :: make_shared non sta chiamando l'operatore (posizionamento) nuovo?
- 7. Android setOnMyLocationChangeListener è obsoleto
- 8. ottenere ora locale con boost
- 9. MySqlCommand Command.Parameters.Add è obsoleto
- 10. NUnit.Framework.Assert.IsInstanceOfType() è obsoleto
- 11. ConfigurationSettings.AppSettings è obsoleto
- 12. UILineBreakModeTailTruncation è obsoleto
- 13. LDAP è obsoleto?
- 14. CodeDomProvider.CreateCompiler() è obsoleto
- 15. System.Net.IPAddress.Address' è obsoleto
- 16. $ HADOOP_HOME è obsoleto, Hadoop
- 17. MSMQ è obsoleto?
- 18. Newtonsoft.Json.Schema.JsonSchema è obsoleto?
- 19. MS CHESS è obsoleto?
- 20. setKeepAliveTimeout è obsoleto in iOS9
- 21. boost semplice ora leggibile leggibile da oggi
- 22. Obsoleto: Function split() è obsoleto. Come riscrivere questa affermazione?
- 23. Obsoleto: Function split() è obsoleto. Come risolvere questa affermazione?
- 24. funzioni make_shared e emplace
- 25. Il tipo Gallery è obsoleto
- 26. RKResponseDescriptor in RESTKit è obsoleto
- 27. Android StringBody (String) è obsoleto
- 28. C++ make_shared non disponibile
- 29. CFURLDestroyResource è ora obsoleto in iOS7. Qualcuno sa invece cosa usare?
- 30. AutoMapper.Mapper.CreateMap <TSource, tIndirizzo>()' è obsoleto
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
... 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