Was passiert hier?



  • Hi, was macht denn die folgende Funktion wobei die Funktion GetMyDouble einen Zeiger auf einen dynamisch erzeugten Double zurückgibt?

    Double MyDouble()
    {
    	return *static_cast<const Double*>(GetMyDouble());
    }
    


  • Sie gibt vermutlich den Wert des Doubles zurück. (Der Rückgabewert von GetMyDouble() wird in einen const Double* gecastet, welcher dann dereferenziert wird.)

    Wobei das schon lustig ist.. steht da irgendwo
    typedef double Double
    😕



  • Diese Funktion verwendet den Rückgabewert von GetDouble() als einen Zeiger auf einen Double - und liefert den Wert zurück, auf den er verweist. Das klappt aber nur, wenn GetDouble() etwas halbwegs passendes liefert - und provoziert vermutlich ein Spiecherleck, weil niemand den in GetDouble() angeforderten Speicher freigibt.



  • Nein, Double ist eine Wrapper-Klasse um double. Dass die Funktion den Wert zurück gibt ist mir auch klar. Aber wie genau geschieht das? Wird eine Kopie des dynamisch erzeugten Objektes angelegt?
    Wenn nein, warum wird dann nach

    {
        Double tmpDouble = GetMyDouble();
    }
    

    der dynamisch erzeugte Double nicht zerstört?



  • Vielleicht zeigst du mal etwas mehr im Zusammenhang, was da eigentlich passiert. Das ganze sieht für mich nämlich reichlich instabil aus.



  • StellerFragen schrieb:

    Nein, Double ist eine Wrapper-Klasse um double. Dass die Funktion den Wert zurück gibt ist mir auch klar. Aber wie genau geschieht das? Wird eine Kopie des dynamisch erzeugten Objektes angelegt?
    Wenn nein, warum wird dann nach

    {
        Double tmpDouble = GetMyDouble();
    }
    

    der dynamisch erzeugte Double nicht zerstört?

    Wenn die Funktion GetMyDouble() mittels new oder malloc Speicher anfordert, bleibt dieser auch nach Verlassen der Funktion erhalten (Der Speicher wird nämlich auf dem Heap reserviert, nicht auf dem Stack). Den Speicherbereich muss man hinterher "manuell" mit delete oder free freigegeben.

    Edit: Zum Freigeben braucht man den Zeiger auf den Speicherbereich, im Moment sieht mir das so aus, als ob der verloren geht.



  • Die Funktion ist Teil einer Klasse die wiederum einen Vector von dynmamischen Objecten hat, die dann im Destructor gelöscht werden. Von daher sollte das freigeben sichergestellt sein.



  • Und was genau gibt diese Funktion eigentlich zurück? Nach dem ersten Beitrag zu urteilen liefert sie einen Zeiger, nach dem zweiten Beitrag ein Objekt bzw. eine Referenz.



  • Oh, sorry ist schon spät. In meinem zweiten Post sollte MyDouble() stehen. Die Funktion GetMyDouble() liefert einen Zeiger aus dem Vector zurück.



  • Und wozu benötigst du dann den Cast? Wenn du dir sicher bist, was GetMyDouble() liefern sollte, sollte auch dessen Rückgabetyp stimmen. Andernfalls könnte es passieren, daß du nur Müll erhältst.


Anmelden zum Antworten