Ist das hier falsche Benutzung eines shared_ptr?
-
EOutOfResources schrieb:
Shade Of Mine schrieb:
warum haeltst du Smartpointer nicht fuer sinnvoll? Ohne Smartpointer kein RAII und ohne RAII kein guter Code...
Einzelne Objekte erzeuge ich auf dem Stack. Verstehe ich dich falsch?
Und wie machst du das dann beim Einsatz der Polymorphie?
MfG SideWinder
-
Vielleicht so?
#include <iostream> class A { public: virtual void hello_world() { std::cout << "A: Hello World!" << std::endl; } }; class B : public A { public: virtual void hello_world() { std::cout << "B: Hello World!" << std::endl; } }; int main(int argc, char *argv[]) { A&& my_object = B(); my_object.hello_world(); }
-
Wieso geht Polymorphie stackwise nicht?
class X { public: virtual void foo() {std::cout << "Hallo";} }; class Y : public X { public: virtual void foo() {std::cout << "Halloooo!!";} }; void callIt(X& ref) { ref.foo(); } int main() { Y y; callIt(y); }Edit: Wieso R-Value-Referenz? Eine ganz normale tut doch auch oder wird bei nem auf dem Stack erstellten Objekt nicht zwangsläufig ne Vtable erstellt?
-
Eisflamme schrieb:
Edit: Wieso R-Value-Referenz? Eine ganz normale tut doch auch oder wird bei nem auf dem Stack erstellten Objekt nicht zwangsläufig ne Vtable erstellt?
Ich wollte nur den blöden Fehler wegen der non-const Referenz auf ein rvalue wegbekommen

-
Man merkt deutlich, dass EOutOfResources noch im "Hello World" Bereich ist und noch nie was größeres geschrieben hat.

-
MitleserROT schrieb:
Man merkt deutlich, dass EOutOfResources noch im "Hello World" Bereich ist und noch nie was größeres geschrieben hat.

Kann ich nicht bestätigen
.EDIT: Ich nutze generell keine Smartpointer und das kann euch doch egal sein. Ihc hatte deswegen nie Probleme.
-
EOutOfResources schrieb:
MitleserROT schrieb:
Man merkt deutlich, dass EOutOfResources noch im "Hello World" Bereich ist und noch nie was größeres geschrieben hat.

Kann ich nicht bestätigen
.Dann erklaer mal deine Aussage bzgl Stack/Heap.
-
EOutOfResources schrieb:
MitleserROT schrieb:
Man merkt deutlich, dass EOutOfResources noch im "Hello World" Bereich ist und noch nie was größeres geschrieben hat.

Kann ich nicht bestätigen
.Was hast du denn schon größeres geschrieben? von RAII hältst du dann wohl auch nicht so viel, oder?
-
Smarter? schrieb:
Hi!
Ich habe zu diesem Code eine Frage:
Foo* f = new Foo("MyFoo"); shared_ptr<Foo> p1(f); int c = p1.use_count(); // 1 shared_ptr<Foo>p2(f); c = p1.use_count(); // 1 c = p2.use_count(); // 1Das ist eine falsche Benutzung eines shared_ptr, oder?
Wenn p1 und p2 aus dem Scope gehen, wird ja zwei mal versucht f zu löschen, oder?Ich vermute mal du hast nur einen Pointer als Parameter, aber du möchtest eigentlich an den shared_ptr, der diesen enthält?
#include <iostream> #include <boost/enable_shared_from_this.hpp> class Foo : public boost::enable_shared_from_this<Foo>{ }; int main(){ Foo* f = new Foo(); boost::shared_ptr<Foo> p1(f); int c = p1.use_count(); // 1 std::cout << c << std::endl; boost::shared_ptr<Foo>p2(f->shared_from_this()); c = p1.use_count(); // 2 std::cout << c << std::endl; }Gruß,
XSpille
-
Shade Of Mine schrieb:
Dann erklaer mal deine Aussage bzgl Stack/Heap.
Ich verstehe nicht, was es daran auszusetzen gibt, dass ich das Objekt auf dem Stack statt über einen Smartpointer auf dem Heap anlege.
-
Nachfrager schrieb:
von RAII hältst du dann wohl auch nicht so viel, oder?
Eigentlich doch....
Wieso änderst du deinen Namen bei jedem Post?
-
EOutOfResources schrieb:
Shade Of Mine schrieb:
Dann erklaer mal deine Aussage bzgl Stack/Heap.
Ich verstehe nicht, was es daran auszusetzen gibt, dass ich das Objekt auf dem Stack statt über einen Smartpointer auf dem Heap anlege.
Weil es beim Verlassen des Scopes zerstört wird und man halt 'manchmal' Objekte hat, die länger leben sollen...
EDIT: Ich hoffe er verwendet hier nur Smart-Pointer wegen Code-Reduktion... Zumal er noch threadsafe ist

-
EOutOfResources schrieb:
Shade Of Mine schrieb:
Dann erklaer mal deine Aussage bzgl Stack/Heap.
Ich verstehe nicht, was es daran auszusetzen gibt, dass ich das Objekt auf dem Stack statt über einen Smartpointer auf dem Heap anlege.
Und Nachts ist es kaelter als draussen.
Wenn du etwas auf den Stack anlegen kannst - dann bedeutet dies, dass du die Lebenszeit des Objektes nicht dynamisch festlegst sondern statisch. Es bedeutet, dass dieses Objekt eine genau definierte, statische, Lebensdauer hat.
Hier verwendet man nie Smartpointer. Es wuerde keinen Sinn machen.
Wenn aber die Lebensdauer dynamisch sein muss, dann muss man das Objekt per new oder aehnlichem anlegen und genau dann sind Smartpointer erstmal erste Wahl.
Und genau das verwirrt hier. Denn Stack Objekte mit Smartpointern vergleichen ist dumm. Das deutet daraufhin dass du etwas grundlegendes nicht verstanden hast. Deshalb die Frage ob du es erklaeren kannst.
PS:
einzeilige Posts zeigen auch nicht wirklich von viel interesse etwas sinnvolles zu dieser diskussion beizutragen...
-
Shade Of Mine schrieb:
Es bedeutet, dass dieses Objekt eine genau definierte,
statischeautomatische, Lebensdauer hat.Ich hätte nicht gemeckert, wenn da ein anderes Wort als statisch stehen würde, aber statische Lebensdauer ist etwas anderes (auch wenn ich annehme, dass du das weisst).

-
drakon schrieb:
Shade Of Mine schrieb:
Es bedeutet, dass dieses Objekt eine genau definierte,
statischeautomatische, Lebensdauer hat.Ich hätte nicht gemeckert, wenn da ein anderes Wort als statisch stehen würde, aber statische Lebensdauer ist etwas anderes (auch wenn ich annehme, dass du das weisst).

Statisch im Sinne von Starr (gegenteil von dynamisch). Nicht static.
-
EOutOfResources schrieb:
Shade Of Mine schrieb:
Dann erklaer mal deine Aussage bzgl Stack/Heap.
Ich verstehe nicht, was es daran auszusetzen gibt, dass ich das Objekt auf dem Stack statt über einen Smartpointer auf dem Heap anlege.
Das eine hat doch nichts mit dem anderen zu tun.
Wie willst du denn einen dynamischen Baum mit Knoten aufbauen, wenn du nur den Stack benutzt? So ein Schwachsinn
-
Omgg schrieb:
Wie willst du denn einen dynamischen Baum mit Knoten aufbauen, wenn du nur den Stack benutzt? So ein Schwachsinn
Wenn man die Klasse selbst schreibt, kann man die Allokation und die Freigabe selbst übernehmen...
-
EOutOfResources schrieb:
Wenn man die Klasse selbst schreibt, kann man die Allokation und die Freigabe selbst übernehmen...
Ich dachte, du würdest was von RAII halten

Sieh es doch ein, Smart-Pointer sind äusserst sinnvoll. Erst recht sobald der Code etwas komplexer wird und mehrere
return-Statements oder Exceptions vorkommen können. Stack-Objekte helfen dir auch nicht immer weiter, in solchen Fällen wird der Code ohne Smart-Pointer extrem umständlich.
-
EOutOfResources schrieb:
Omgg schrieb:
Wie willst du denn einen dynamischen Baum mit Knoten aufbauen, wenn du nur den Stack benutzt? So ein Schwachsinn
Wenn man die Klasse selbst schreibt, kann man die Allokation und die Freigabe selbst übernehmen...
Dennoch kann die Allokation nicht auf dem Stack stattfinden.
PS:
Oder zeig eine implementierung einer add() methode fuer eine beliebige Datenstruktur die ohne dynamische Allokation auskommt.
-
EOutOfResources, im folgenden ein kurzes Beispiel (hier sogar nur mit lokaler Variablengültigkeit).
Deine Aufgabe besteht darin, ohne Smart-Pointer äquivalenten Code zu schreiben. Gehe davon aus, dass jede aufgerufene Funktion der Klassen
Base,Derived1undDerived2eine Exception werfen kann.int Fn() { scoped_ptr<Derived1> a(new Derived1); scoped_ptr<Base> b; if (...) b.reset(new Derived1); else b.reset(new Derived2); if (b->MemFn1()) return 2; a->MemFn2(); if (b->MemFn3()) return 4; else return 7; }