Speicherreservieren mit *new Klassenname()



  • Hallo an alle,

    ich hab eine Frage zur Speicherreservierung:

    Wenn ich in C++ so Speicher reserviere:

    *new Klassenname()

    ohne einen Zeiger zu erstellen oder an eine Variable zuzuweisen, so habe ich doch auch keine Referenz mehr um auf das Objekt zuzugreifen und den Speicher wieder freizugeben oder? -> Memory Leak ???



  • Ja, das ist ein Leak.

    Edit @knivil:
    Ja, das ist eine Möglichkeit. Aber ich würde gerne mal ein Beispiel sehen, wobei das sinnvoll ist.



  • Kommt drauf an, was der Konstruktor macht, kommt drauf an, ob new ueberladen ist, kommt drauf an, ob du einen Garbage Collector benutzt, kommt drauf an, ...



  • Jetzt bin ich gespannt.
    Doch nicht.



  • Jockelx schrieb:

    Jetzt bin ich gespannt.

    Wg. knivils Kommentar?
    Wenn sich das Objekt im Konstruktor z.B. selber in irgend eine Queue schiebt, wo es irgendwann abgearbeitet und danach zerstört wird, gibt es natürlich KEIN Speicherleck.



  • Ja, das hab ich eben nicht gefunden,
    hab jetzt aber gesehen, dass die bekannte Klasse von einer anderen abgeleitet wird und auf eine Liste kommt.
    Passt also alles.

    Danke!



  • Damit es nochmal explizit hier steht: Solche Seiteneffekte sind furchtbar.

    Aber Hauptsache Dereferenzierung.



  • Ich steh gerade auf der Leitung? Seiteneffekte? Was meinst du?
    Warum hauptsache Dereferenzierung? Was hat das für einen Unterschied zu new Klassenname() ??



  • Anaconda55 schrieb:

    Ich steh gerade auf der Leitung? Seiteneffekte? Was meinst du?

    Dass new nicht nur Speicher anfordert, sondern auch noch das Objekt in eine Liste einfügt und einen GC-ähnlichen Mechanismus im Hintergrund laufen lässt, und dadurch so konzipiert ist, dass es ohne anschliessende Zuweisung an einen Zeiger verwendet wird. Ist ja nicht so, dass man keine aussagekräftigere Funktion für diesen Vorgang schreiben könnte.

    Anaconda55 schrieb:

    Warum hauptsache Dereferenzierung? Was hat das für einen Unterschied zu new Klassenname() ??

    Keinen, da liegt ja das Problem. Das Sternchen bei

    *new MyClass()
    

    hat keinen Effekt. Als ob ein alleinstehendes new nicht schon genügend verwirrend wäre.



  • Dass new nicht nur Speicher anfordert, sondern auch noch das Objekt in eine Liste einfügt und einen GC-ähnlichen Mechanismus im Hintergrund laufen lässt, und dadurch so konzipiert ist, dass es ohne anschliessende Zuweisung an einen Zeiger verwendet wird. Ist ja nicht so, dass man keine aussagekräftigere Funktion für diesen Vorgang schreiben könnte.

    Ich habe das nicht verbrochen. 😉
    Danke für die Info.


Log in to reply