wie die unique_ptr einsetzen?
-
danke - das ist wohl eines der themen wo es noch ein bisschen was zu lesen gibt, z.b.
https://thispointer.com/shared_ptr-binary-trees-and-the-problem-of-cyclic-references/
oder
interessant auch das kleine programm bzgl sizeof unique_ptr
#include <iostream> #include <typeinfo> #include <memory> using namespace std; int main() { typedef unique_ptr<int> unique_int_ptr; int * raw_int_ptr; cout << typeid(unique_int_ptr).name() << ": "; cout << sizeof(unique_int_ptr) << endl; cout << typeid(raw_int_ptr).name() << ": "; cout << sizeof(raw_int_ptr) << endl; return 0; }
gibt:
class std::unique_ptr<int,struct std::default_delete<int> >: 4 int *: 4
-
@patrickm123 sagte in wie die unique_ptr einsetzen?:
class std::unique_ptr<int,struct std::default_delete<int> >: 4 int *: 4
Eine der wohl herausragendsten Stärken von C++ ist, dass sich damit sehr hochlevelige Abstraktionen bauen lassen, die dennoch extrem leichtgewichtig sind. Dieser Größenvergleich gibt einem schon eine Idee, was das letzendlich bedeutet. Auch der erzeugte Code wird nahezu exakt derselbe sein, wie bei manuellem
new
/delete
.
-
Also was ich mich noch irgendwie verwirrt ist der umgang mit unique_ptr und funktionen, z.b
#include <iostream> #include <memory> using namespace std; auto unique_int_1() { auto p = unique_ptr<int>(new int(123)); return p; } void modify_p(unique_ptr<int> p) { // *p = 234; } int main() { auto p = unique_int_1(); modify_p(p); cout << *p << endl; return 0; }
der compiler will im main p nicht mehr in modify_p annehmen... p ist ja eine adresse, oder wie soll ich den fehler verstehen?
ptrs_2.cc:24:12: error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]'
-
ok, das hier tut was:
#include <iostream> #include <memory> using namespace std; auto unique_int_1() { auto p = unique_ptr<int>(new int(123)); return p; } auto modify_p(unique_ptr<int> p) { *p = 234; return p; } int main() { auto p = unique_int_1(); p = modify_p(std::move(p)); cout << *p << endl; return 0; }
-
@manni66 sagte in wie die unique_ptr einsetzen?:
Ein unique_ptr besitzt das Objekt. Das scheint dir nicht wirklich klar zu sein.
Wenn die Funktion einen unique_ptr als Parameter hat, übernimmt sie den Besitz!
void modify_p(int& p) { p = 234; } int main() { auto p = unique_int_1(); modify_p(*p);
-
p = modify_p(std::move(p)); cout << *p << endl;
Nein! Den Pointer darfst du nach dem move nicht mehr dereferenzieren!Edit: ok, jetzt wird er zurück gegeben, dann ist das technisch Ok, aber nicht sinnvoll.
-
@manni66 wenn ich in einer funktion den inhalt des unique_ptr verändern will, move ich den pointer dann in den scope der funktion - oder kann ich eine Referenz auf den Inhalt übergeben? Mir ist die Umwandlung des unique_ptr zur Referenz aber nicht ganz klar.... dass die pointer ownership gemoved werden kann verstehe ich langsam.
-
@patrickm123 sagte in wie die unique_ptr einsetzen?:
oder kann ich eine Referenz auf den Inhalt übergeben? Mir ist die Umwandlung des unique_ptr zur Referenz aber nicht ganz klar....
Ja, das habe ich doch schon gezeigt:
@manni66 sagte in wie die unique_ptr einsetzen?:
void modify_p(int& p) { p = 234; } int main() { auto p = unique_int_1(); modify_p(*p);
-
This post is deleted!
-
This post is deleted!