delete eines Objekts auf dem Stack



  • nwp3 schrieb:

    Das könnte ausdrücken was du willst. Auf einem 32-Bit-System könntest du Glück haben dass ein double die 32-Bit-Adresse verlustfrei speichern kann und es nicht abstürzt. Wenn vorher == nachher, dann funktioniert das, ansonsten nicht. Und mit "funktioniert" meine ich dass das Undefined Behavior tut was du möchtest.

    Ok, das funktioniert schonmal (vorher == nachher), aber das ist jetzt also UB? Kann man das irgendwie vermeiden, also dass es immer klappt?



  • Ja, call by reference.



  • Aber wie soll ich das machen, das Programm für das ich den Wrapper schreibe kennt gar keine Referenzen. In der C++ Schnittstelle kann ich mir nur einen pointer auf eine Kopie des übergebenen Wertes holen, daher muss ich die Adresse in dem Wert des doubles codieren.



  • Wieso ersetzt du das double nicht einfach mit einem double *?



  • nwp3 schrieb:

    Wieso ersetzt du das double nicht einfach mit einem double *?

    Wie gesagt, das kann ich nicht. Ich kann nur doubles übergeben und zurückgeben, sonst nichts. Ich muss also aus dem double irgendwie einen validen pointer auf mein Ursprungsobjekt zurückcasten.



  • Kannst du nicht mit ints und handles arbeiten? Ich würds noch sauberer finden, wenn der Parameter ein Handle ist.



  • 1. Warum willst du überhaupt den Pointer dort löschen?
    ggf. gibt es im Code-Fluss eine besser Stelle?

    2. Es gibt doch sicherlich die Möglichkeit globale Variablen zu benutzen?

    std::map<double, yourType*> AllYourPointers;
    

    Dann ist die double Variable eben der Index, dann ist call by value auch egal.



  • double als key einer map ist eine schlechte Idee. Rundungsfehler können unvorhersehbare Folgen haben.



  • void *alloca(size_t size);
    

    dann musst du ihn nicht freigeben....



  • Mechanics schrieb:

    Kannst du nicht mit ints und handles arbeiten? Ich würds noch sauberer finden, wenn der Parameter ein Handle ist.

    ints würde auch gehen, aber das Prinzip würde ja das gleiche bleiben, oder?

    nurf schrieb:

    2. Es gibt doch sicherlich die Möglichkeit globale Variablen zu benutzen?

    std::map<double, yourType*> AllYourPointers;
    

    Dann ist die double Variable eben der Index, dann ist call by value auch egal.

    Nee, gibts so leider nicht, zumindest nicht über verschiedene Funktionen hinaus. Eine globale Variable kann ich zwar schon anlegen, aber nur innerhalb eines Moduls...

    HelloWorldFan schrieb:

    void *alloca(size_t size);
    

    dann musst du ihn nicht freigeben....

    Aber ich will ja wieder freigeben können.



  • happystudent schrieb:

    ints würde auch gehen, aber das Prinzip würde ja das gleiche bleiben, oder?

    Ich würd eben keine Zeiger übergeben, sondern handles. Könnte z.B. so ausschauen wie bei nurf, also mit einer map<int, object>. In deiner Funktion brauchst du dann eine Möglichkeit, über das Handle an das Objekt zu kommen. Kann vielleicht eine globale Zugriffsfunktion sein.



  • happystudent schrieb:

    Mechanics schrieb:

    Kannst du nicht mit ints und handles arbeiten? Ich würds noch sauberer finden, wenn der Parameter ein Handle ist.

    ints würde auch gehen, aber das Prinzip würde ja das gleiche bleiben, oder..

    ich würde in dem Fall ein uint64 nehmen und die Adresse damit so übergeben wie NWP3 es bei dem double machst. Ich sehe darin dann auch ein problem bei einer anwendung auf einem 32 bit System..


Anmelden zum Antworten