static auto_ptr ?
-
@Gestalt
Mehrere Dinge fallen mir zusätzlich zu den vorhergehenden Beiträgen auf:1.) Vermeide soweit wie möglich
new
sondern nutzestd::make_unique
bzw.std::make_shared
.2.) Bei static Variablen (hier
mDialog
) bekomme ich immer etwas Bauchschmerzen. Denn sind die Daten inmDialog
stets gültig? Schlimmer noch, du nutzt zur Konstruktion denthis
Zeiger. Im schlimmsten Fall speicherst du den Zeiger inmDialog
und bindest so die Lebenszeit vonthis
an die Lebenszeit vonmDialog
. Das ist ein unnötiger und fehleranfälliger Seiteneffekt.
-
@Quiche-Lorraine
ich verstehe was Du meinst - aber this ist in dem Fall die Hauptform - und dieser wird niemals seine Gültigkeit verlieren solange das Programm läuft.ich guck mir das mal an in wie weit ich Formulare mit std::make_unique bzw. std::make_shared ins leben rufen kann.
static kann ich auch vermeiden in dem ich den Zeiger einfach global declariere, was wieder auch alles nicht schön sein soll.
-
@Tyrdal
ohne static ploppt das Fenster kurz auf und schließt sich dann automatisch da die Funktion abgearbeitet wurde.Ohne static geht es nur wenn ich den Zeiger gloabal deklariere.
-
Dieser Beitrag wurde gelöscht!
-
@john-0 sagte in static auto_ptr ?:
shared_ptr wäre der funktionierende Ersatz für auto_ptr.
und warum nicht unique_ptr? will das Formular nicht kopieren oder ähnliches
-
@Gestalt sagte in static auto_ptr ?:
@Tyrdal
ohne static ploppt das Fenster kurz auf und schließt sich dann automatisch da die Funktion abgearbeitet wurde.Ohne static geht es nur wenn ich den Zeiger gloabal deklariere.
Das liegt daran, dass du das Fenster mit
Show()
anzeigst, das ist dann nicht-modal und dein Programmcode wird weiter abgearbeitet. Derauto_ptr
geht out-of-scope und löscht das gehalteneCDlg
Objekt. Dasstatic
benutzt du als Krücke, weil du nicht verstanden hast (nicht böse sein, bitte), wann und warum Objekte zerstört werden.
Wenn das Fenster bestehen bleiben soll musst du dir über die Lebenszeit deines smart_ptrs im Klaren sein und den ggf. da halten, wo er nicht sofort wieder zerstört wird (zB als Member der Klasse).
-
@DocShoe es ist richtig was Du sagst, und ja ich weiß daß das Object zerstört wird nachdem die Funktion abgearbeitet ist, also bastel ich mir Möglichkeiten dies zu verhindern. Meistens öffne ich ein Fenster MODAL dann gibt es diese Probleme nicht, aber in seltenen Fällen benötige ich eben wie in diesen Fall ein nicht-modales Fenster. Und wegen der Lebenszeit kann ich ja auch global deklarieren ohne static zu benutzen oder ebend dort wo er nicht gleich wieder zerstört wird. Und wieso sollte ich static nicht benutzen wenn es sowas gibt? Auch wenn es eine "Krücke" sein soll - funktioniert doch gut - aber woher soll ich wissen das man das so nicht machen sollte wenn es doch aber geht? Und wenn ich mir mit smart-pointern nicht mal Gedanken machen muss über Speicher löschen dann ist doch die IT-Welt in Ordnung.
-
@Gestalt sagte in static auto_ptr ?:
und warum nicht unique_ptr? will das Formular nicht kopieren oder ähnliches
Weil
autor_ptr
zu einer Zeit (C++ 1998) in C++ eingeführt wurde, in der einunqiue_ptr
unmöglich gewesen wäre. Man hat aber schnell festgestellt, dassauto_ptr
nicht funktioniert und es meines Wissen bereits in C++ 2003 wieder entfernt bzw. als obsolet gekennzeichnet. Die erste funktionierende Smart Pointer Klasse warboost::shared_ptr
, die bereits mit C++ 1998 funktionierte.Erst mit C++ 2011 wurde dann die notwendigen Fähigkeiten in die Sprache integriert, um
std::unique_ptr
in die Sprache einzuführen. Gleichzeitig wurdestd::shared_ptr
in die Sprache aufgenommen.Welcher Smart Pointer an dieser Stelle sinnvoll ist, ist ein anderes Thema und es gab bereits dazu Postings.
P.S. In welcher Dokumentation hast Du auto_ptr ausgegraben? Das ist ja Leichenfledderei.
-
@john-0 sagte in static auto_ptr ?:
@Gestalt sagte in static auto_ptr ?:
und warum nicht unique_ptr? will das Formular nicht kopieren oder ähnliches
Weil
autor_ptr
zu einer Zeit (C++ 1998) in C++ eingeführt wurde, in der einunqiue_ptr
unmöglich gewesen wäre. Man hat aber schnell festgestellt, dassauto_ptr
nicht funktioniert und es meines Wissen bereits in C++ 2003 wieder entfernt bzw. als obsolet gekennzeichnet. Die erste funktionierende Smart Pointer Klasse warboost::shared_ptr
, die bereits mit C++ 1998 funktionierte.Erst mit C++ 2011 wurde dann die notwendigen Fähigkeiten in die Sprache integriert, um
std::unique_ptr
in die Sprache einzuführen. Gleichzeitig wurdestd::shared_ptr
in die Sprache aufgenommen.Welcher Smart Pointer an dieser Stelle sinnvoll ist, ist ein anderes Thema und es gab bereits dazu Postings.
P.S. In welcher Dokumentation hast Du auto_ptr ausgegraben? Das ist ja Leichenfledderei.
Ich kannte es auch ohne veraltete Bücher oder sonstiges. Zumindest hier https://en.cppreference.com/w/cpp/memory/auto_ptr ist es auch erst seit C++11 obsolet bzw. C++17 entfernt.
-
@john-0 sagte in static auto_ptr ?:
P.S. In welcher Dokumentation hast Du auto_ptr ausgegraben? Das ist ja Leichenfledderei.
da muss ich scholzen, kann mich daran nicht mehr erinnern