Wieso darf man nur 1x `make_shared()` aufrufen, wenn man `shared_ptr` in 3 `vector`s verwenden möchte?
-
Also ich habe schon die ganze Zeit den Fehler gesucht (in einer Schleife):
X x1(...); shared_ptr<X> x2 = make_shared<X>(x1); v1.push_back(x2); v2.push_back(x2); //... (Block wird verlassen)
Das funktioniert, aber das funktioniert nicht (später ist dann v2 immer "leer"):
X x1(...); v1.push_back(make_shared<X>(x1)); v2.push_back(make_shared<X>(x1)); //... (Block wird verlassen)
Könnt ihr mir erklären wieso nicht?
-
Das ist doch quatsch.
#include <memory> #include <vector> #include <iostream> struct X {}; int main() { { std::vector<std::shared_ptr<X>> v1, v2; X x1; auto x2{ std::make_shared<X>(x1) }; v1.push_back(x2); v2.push_back(x2); std::cout << v1.size() << ", " << v2.size() << '\n'; } { std::vector<std::shared_ptr<X>> v1, v2; X x1; v1.push_back(std::make_shared<X>(x1)); v2.push_back(std::make_shared<X>(x1)); std::cout << v1.size() << ", " << v2.size() << '\n'; } }
@EinNutzer0 sagte in Wieso darf man nur 1x
make_shared()
aufrufen, wenn manshared_ptr
in 3vector
s verwenden möchte?:(später ist dann v2 immer "leer")
mcve or it didn't happen.
-
Was meinst du mit "leer"? Die beiden Codes machen sehr verschiedene Dinge (im ersten gibt es zwei Instanzen von X und die beiden Vektoren teilen sich eine davon; im zweiten gibt es drei Instanzen von X und die Vektoren haben zwei vollkommen unabhängige). Da man anhand deiner Beschreibung nicht nachvollziehen kann, was du erwartest/beobachtest/möchtest, kann man dir nicht helfen.
-
@Swordfish Genau, und jetzt ändere mal x1 indem es vorher aus v1 oder v2 geholt und dereferenziert wird, Quatschkopf.
-
@SeppJ sagte in Wieso darf man nur 1x
make_shared()
aufrufen, wenn manshared_ptr
in 3vector
s verwenden möchte?:Die beiden Codes machen sehr verschiedene Dinge (im ersten gibt es zwei Instanzen von X und die beiden Vektoren teilen sich eine davon; im zweiten gibt es drei Instanzen von X und die Vektoren haben zwei vollkommen unabhängige).
-
@SeppJ sagte in Wieso darf man nur 1x `make_shared()` aufrufen, wenn man `shared_ptr` in 3 `vector`s verwenden möchte?:
im ersten gibt es zwei Instanzen von X und die beiden Vektoren teilen sich eine davon; im zweiten gibt es drei Instanzen von X und die Vektoren haben zwei vollkommen unabhängige
Genau, wie der Name es schon vermuten lässt, sollen sich die Vektoren dieselbe Instanz von X teilen... das war meine Intention.
-
@EinNutzer0 sagte in Wieso darf man nur 1x `make_shared()` aufrufen, wenn man `shared_ptr` in 3 `vector`s verwenden möchte?:
@SeppJ sagte in Wieso darf man nur 1x `make_shared()` aufrufen, wenn man `shared_ptr` in 3 `vector`s verwenden möchte?:
im ersten gibt es zwei Instanzen von X und die beiden Vektoren teilen sich eine davon; im zweiten gibt es drei Instanzen von X und die Vektoren haben zwei vollkommen unabhängige
Genau, wie der Name es schon vermuten lässt, sollen sich die Vektoren dieselbe Instanz von X teilen... das war meine Intention.
Na, dann ist Code 1 richtig und Code 2 nicht. Was ist jetzt deine Frage?
-
@SeppJ sagte in Wieso darf man nur 1x `make_shared()` aufrufen, wenn man `shared_ptr` in 3 `vector`s verwenden möchte?:
Na, dann ist Code 1 richtig und Code 2 nicht. Was ist jetzt deine Frage
Wieso ist (1) richtig? ...
-
Weil
x2
aufx1
zeigt und dux2
in beide vektoren stopfst?Im zweiten Code bastelst du ZWEI
shared_ptr<>
auf zwei verschiedene Objekte die beide mitx1
nichts zu tun haben außer daß sie Kopien vonx1
sind.
-
@EinNutzer0 sagte in Wieso darf man nur 1x `make_shared()` aufrufen, wenn man `shared_ptr` in 3 `vector`s verwenden möchte?:
@SeppJ sagte in Wieso darf man nur 1x `make_shared()` aufrufen, wenn man `shared_ptr` in 3 `vector`s verwenden möchte?:
Na, dann ist Code 1 richtig und Code 2 nicht. Was ist jetzt deine Frage
Wieso ist (1) richtig? ...
Weil make_shared ein neues geteiltes Objekt mit den gegebenen Argumenten erstellt, es macht (anders als der Name vielleicht vermuten lässt) nicht aus einem bestehenden Objekt irgendwie magisch ein geteiltes Objekt.
-
Dieser Beitrag wurde gelöscht!
-
Was an dieser Frage wurde noch nicht 3x in diesem Thread beantwortet?
-
@EinNutzer0 sagte in Wieso darf man nur 1x `make_shared()` aufrufen, wenn man `shared_ptr` in 3 `vector`s verwenden möchte?:
Und da frage ich mich eben, wieso nicht, wenn ein
shared_ptr
eine Instanz kapselt.Nochmal, vielleicht fällt dann der Groschen:
make_shared<>()
bastelt ein NEUES Objekt als Kopie seines Arguments.
Willst Du einenshared_ptr<>
auf ein bereits existierendes Objekt dann kopiere einfach denshared_ptr<>
.
-
Ja, Frage beantwortet.
-
Doch noch eine Frage,
- wozu shared_ptr und keine stinknormalen Pointer?,
- wieso kann man unordered_map nur mit solchen benutzen?
-
@EinNutzer0 sagte in Wieso darf man nur 1x
make_shared()
aufrufen, wenn manshared_ptr
in 3vector
s verwenden möchte?:wozu
shared_ptr
und keine stinknormalen Pointer?,Weil
shared_ptr<>
dafür sorgt daß das Objekt auf das er zeigt am leben bleibt solange noch irgendeinshared_ptr<>
darauf zeigt.@EinNutzer0 sagte in Wieso darf man nur 1x
make_shared()
aufrufen, wenn manshared_ptr
in 3vector
s verwenden möchte?:wieso kann man
unordered_map
nur mit solchen benutzen?Mit was?
-
Die Frage "Warum
shared_pointer
?" am mir auch, als ich gestern deinen - inzwischen von dir gelöschten - Code durch gelesen habe. Nicht, weilshared_pointer
keine Einsatzgebiete hätte, sondern weil du es doch sehr exzessiv benutzt hast, ohne das klar zu sein schien, wieso du die Datenstrukturen so gewählt hast, wie du es hast. Das gesamte Datenstrukturdesign kam mir sehr verdächtig vor, da dort anscheinend eine Art Koordination zwischen einer Map und einem Vektor stattfinden soll (noch dazu eine Map mit einem integer als Key, das ist ja praktisch schon fast wieder ein Vector), und du anscheinend denkst, dassshared_pointer
eine gute Lösung dafür wäre.shared_pointer
löst aber überhaupt nicht das Problem inkonsistenter Datenhaltung, es verhindert bloß, dass dein Programm abstürzt, selbst wenn es logisch falsch ist. Was es höchstwahrscheinlich ist, denn es war nicht erkennbar, dass du die eigentliche Problematik gelöst hast.Der gesamte Ansatz mit mehreren Containern mit geteiltem Inhalt ist jedenfalls verdächtig, und muss mindestens sauber abgekapselt werden, oder sogar ganz anders angegangen werde.
-
@SeppJ Wiederhergestellt. Dann schlage bitte etwas besseres vor.
-
@EinNutzer0 sagte in Wieso darf man nur 1x `make_shared()` aufrufen, wenn man `shared_ptr` in 3 `vector`s verwenden möchte?:
@SeppJ Wiederhergestellt. Dann schlage bitte etwas besseres vor.
Ich kann nicht anhand von ein paar Problemzeilen das fundamentale Datenmodell deines Programms ableiten.
-
@EinNutzer0 sagte in Wieso darf man nur 1x `make_shared()` aufrufen, wenn man `shared_ptr` in 3 `vector`s verwenden möchte?:
Doch noch eine Frage,
- wozu shared_ptr und keine stinknormalen Pointer?,
- wieso kann man unordered_map nur mit solchen benutzen?
std::unordered_map kann man mit allem verwenden. Wie kommst du darauf, dass die Verwendungsmöglichkeit eingeschränkt ist?