wake-up-neo.net

was ist der Sinn von std :: unique_ptr :: get

Hat std::unique_ptr::get nicht den Zweck, ein unique_ptr an erster Stelle zu haben? Ich hätte erwartet, dass diese Funktion ihren Status ändert, sodass sie keinen Zeiger mehr enthält ::erhalten?

43
lezebulon

Sie verwenden es jedes Mal, wenn Sie einen einfachen Zeiger an eine C-Funktion übergeben möchten:

std::unique_ptr<char[]> buffer( new char[1024] );
// ... fill the buffer
int rc = ::write( fd, buffer.get(), len );
55

std::unique_ptr bietet sichere eindeutige Besitz-Semantiken. Dies schließt jedoch nicht die Notwendigkeit von Nicht-BesitzZeigern aus. std::shared_ptr hat ein nicht besitzendes Gegenstück, std::weak_ptr. Raw-Zeiger fungieren als std::unique_ptrs nicht-besitzendes Gegenstück.

37
bames53

Die Regel, die ich normalerweise befolge, ist folgende: Wenn der Aufseher sich nicht mit der Lebensdauer/dem Besitz vermischt, geben Sie ihm keinen intelligenten Zeiger. Übergeben Sie stattdessen eine reine C++ - Referenz (bevorzugt) oder einen rohen Zeiger. Ich finde es weitaus sauberer und flexibler, das Anliegen des Eigentums von der Nutzung zu trennen.

24
Nevin

Wenn Ihre Hände gebunden sind und Sie einen Zeiger auf etwas übergeben müssen, liest p.get() besser als &*p.

Es gibt eine Funktion, die den Status ändert, so dass der unique_ptr keinen Zeiger mehr enthält und der Name release lautet. Dies ist vor allem nützlich, um den Besitz auf andere intelligente Zeiger zu übertragen, die keine direkte Konstruktion aus einem unique_ptr bereitstellen. Bei jeder anderen Verwendung besteht die Gefahr, dass die Ressource ausläuft.

14

Herb Sutter hat eine gute Erklärung (um 3:40) https://www.youtube.com/watch?v=JfmTagWcqoE

Der Hauptvorteil besteht darin, dass der eindeutige Zeiger verfolgt, wie viele andere Verweise auf diesen Zeiger vorhanden sind. Sie arbeiten nur mit dem eindeutigen Zeiger, wenn Sie mit Inhaberschaft arbeiten. Wenn Sie etwas mit den Daten mit diesem Zeiger machen möchten, übergeben Sie den Rohzeiger.

4
Mikael

Es ist offensichtlich, dass Sie eine C-API oder eine schlecht konzipierte C++ - API aufrufen müssen.

0
K-ballo