Sayaçların bulunduğu verilerin yanında saklandığından emin olmak için std::make_shared
kullanmanız önerilir. Ne yazık ki dahili olarak std::make_shared<T>
T
için sıfır başlatma kullanır (yani veri bloğunu başlatmak için T()
kullanır). Varsayılan başlatmayı kullanarak kandırmanın bir yolu var mı? std::shared_ptr<T>(new T, [](auto p){delete p;})
'u kullanabileceğimi biliyorum, ama burada iki tahsis ile sonuçlanacağım (veri ve sayaç blokları birbirinin yanında olmayacak).std :: make_shared'i varsayılan başlatmayı kullanarak kandırmanın bir yolu var mı?
cevap
Önemsiz yapıyı zorlamak için türetilmiş bir sınıf oluşturun. Türetilmiş sınıfı oluşturun, ancak istediğiniz ortak işaretçiye atayın. Bu tip-güvenli yıkıcının göre olduğunu
std::shared_ptr<T> p = std::make_shared<D>();
Not. shared_ptr
her zaman tip silme işlemini gerçekleştirir ve basit POD nesneleri için bile yıkıcı aramadan önce dinamik gönderim kullanır.
@Potatoswatter Genius ile aynı değildir ... Bunun nasıl ortaya çıktığı hakkında hiçbir fikrim yok. –
Evet ... Tip silme, std :: shared_ptr içinde gerçekten takdir etmediğim bir şeydir. Ama ben 4 farklı homegrown akıllı işaretçiler gibi büyük eski codebase ile başa - nasıl baktığına bakmaksızın std :: shared_ptr herhangi birinden daha iyidir :-) –
Yum: 'template
- 1. std :: string dizgesine std :: string akımını iletme yolu var mı?
- 2. std :: make_shared değer başlatmayı gerçekleştiriyor mu (GCC ve clang katılmıyorum)?
- 3. Varsayılan kurulum diyaloğunda logoyu değiştirmenin herhangi bir yolu var mı?
- 4. Varsayılan olarak JavaScript özniteliğini kullanmanın bir yolu var mı?
- 5. std :: function'un bağımsız bir uygulaması var mı?
- 6. CoffeeScript kullanarak bir şey döndürmemenin bir yolu var mı?
- 7. Bir dll sürümünü kullanarak zorlamak için bir yolu var mı?
- 8. InitializeCriticalSectionAndSpinCount, varsayılan bir Spin Sayısı var mı?
- 9. $ .ajax'ın varsayılan nesnesini almanın bir yolu var
- 10. PDF'leri pdf.js'de birleştirmenin bir yolu var mı?
- 11. Selenium Webdriver kullanarak URL metnini değiştirmenin bir yolu var mı?
- 12. CFStreamCreatePairWithSocketToHost() kullanarak soket başvurusu almanın bir yolu var mı?
- 13. Bir nesnede varsayılan işlev var mı?
- 14. WiX yapılarını hızlandırmanın bir yolu var mı?
- 15. ConfigurationManager.AppSettings'i geçersiz kılmanın bir yolu var mı?
- 16. Hafızayı sınırlamanın bir yolu var mı?
- 17. django.db.connection.queries öğesini temizlemenin bir yolu var mı?
- 18. Windows PowerShell kullanarak işlemleri durduran nazik bir yol var mı?
- 19. Paketli Eklentiler listesini otomatik olarak oluşturmanın bir yolu var mı?
- 20. Git, varsayılan olarak öntanımlı olarak var mı?
- 21. CGPoints'i karşılaştırmanın bir yolu var mı?
- 22. RubyGems'i çevrimdışı güncellemenin bir yolu var mı?
- 23. Düzenleri canlandırmanın bir yolu var mı? [Android]?
- 24. Pydev'de REPL almanın bir yolu var mı?
- 25. YQL'i HTML'ye döndürmenin bir yolu var mı?
- 26. Parametreyi çıkarmanın bir yolu var mı?
- 27. Tip bildirimlerini genişletmenin bir yolu var mı?
- 28. cuBLAS'da "saypx" yapmanın bir yolu var mı?
- 29. Files.write (...) yöntemini almanın bir yolu var mı?
- 30. "Vurgulu" kodun herhangi bir yolu var mı?
Varsayılan "T" nin başlatılması T() 'dir. Yeni T' yeni T() ile aynı. Ayrıca, varsayılan silmeyi belirtmeye gerek yoktur. Tam olarak ne elde etmeye çalışıyorsun? –
, varsayılan başlatmayı –
@AndreiR yapan bir kurucuyla T sarıcısı yapar. Hayır, bu yanlış. 'T()', değer sıfırlamasıdır ve bu bir fark yaratabilir. – juanchopanza