deleteme - wieso funktioniert das nicht?



  • 😮 Leute\{SeppJ}, ihr müsst alle dringend noch mal an ein Grundlagenbuch in C++.


  • Mod

    EOP schrieb:

    Eigentlich dachte ich, daß ich zumindest eine Speicherzugriffsverletzung bekomme nachdem ich das Objekt genullt habe.

    Wieso? Du greifst doch auf keinen Speicher zu. Und selbst wenn: Dann ist der Speicher eben Null, na und?

    Deine Objektvorstellung scheint grundsätzlich falsch zu sein. Aber so richtig. Ich bin mir aber auch nicht sicher, wie ich sie korrigieren kann, da ich nicht einmal verstehe, was du dir vorstellst. Bist du eventuell der Ansicht, eine Funktion wäre Teil eines Objekts?



  • Ein kleiner Test hat sich zu einer ganz interessanten Geschichte entwickelt...

    SeppJ schrieb:

    Bist du eventuell der Ansicht, eine Funktion wäre Teil eines Objekts?

    Ehrlich gesagt - Ja.
    Bin aber immer bereit dazuzulernen.

    Ich dachte, wenn ich das Objekt (vermeintlich) lösche, ist auch der ganze andere Krempel weg bzw. "dangling in nowhere".


  • Mod

    EOP schrieb:

    Ein kleiner Test hat sich zu einer ganz interessanten Geschichte entwickelt...

    War das ein Test, wie das Forum reagiert? Denn irgendwie kommt mir die Fragestellung komisch vor, für jemanden, der vor weniger als 24 Stunden erfolgreich eine Verwundbarkeit durch einen Buffer-Overflow-Fehler demonstriert hat.



  • SeppJ schrieb:

    EOP schrieb:

    Ein kleiner Test hat sich zu einer ganz interessanten Geschichte entwickelt...

    War das ein Test, wie das Forum reagiert? Denn irgendwie kommt mir die Fragestellung komisch vor, für jemanden, der vor weniger als 24 Stunden erfolgreich eine Verwundbarkeit durch einen Buffer-Overflow-Fehler demonstriert hat.

    Ne, war nur als Gag gedacht für die Leute, die sich gelöscht haben wollen. Hat aber anscheinend nicht geklappt.

    Ich werde mit Sicherheit nicht c-plusplus.net angreifen. Bin einer von den Guten. 😉


  • Mod

    EOP schrieb:

    Ich werde mit Sicherheit nicht c-plusplus.net angreifen. Bin einer von den Guten. 😉

    Nein, ich meinte das hier:
    https://www.c-plusplus.net/forum/p2462714#2462714

    Von jemanden, der so etwas macht, die Frage in diesem Thread zu hören, ist wie wenn Franz Beckenbauer einen fragt, wie nochmal die Abseitsregel lautet.

    Ne, war nur als Gag gedacht für die Leute, die sich gelöscht haben wollen. Hat aber anscheinend nicht geklappt.

    War leider zu subtil.



  • SeppJ schrieb:

    EOP schrieb:

    Ich werde mit Sicherheit nicht c-plusplus.net angreifen. Bin einer von den Guten. 😉

    Nein, ich meinte das hier:
    https://www.c-plusplus.net/forum/p2462714#2462714

    Von jemanden, der so etwas macht, die Frage in diesem Thread zu hören, ist wie wenn Franz Beckenbauer einen fragt, wie nochmal die Abseitsregel lautet.

    Don't panic - der war ja nur eine Demo für den OP.



  • Zurück zum Thema:
    Ich weiss immer noch nicht sicher, wie ich eine "Selbstzerstörungsfunktion" implementieren könnte.

    Viele Antworten aber nichts Überzeugendes.


  • Mod

    EOP schrieb:

    Zurück zum Thema:
    Ich weiss immer noch nicht sicher, wie ich eine "Selbstzerstörungsfunktion" implementieren könnte.

    Definiere "Selbstzerstörung"!



  • SeppJ schrieb:

    EOP schrieb:

    Zurück zum Thema:
    Ich weiss immer noch nicht sicher, wie ich eine "Selbstzerstörungsfunktion" implementieren könnte.

    Definiere "Selbstzerstörung"!

    Ich möchte mich - also mein Objekt - von innen heraus zerstören/löschen.

    Das ganze ist eigentlich nur eine blödsinnige Idee nachdem ich das gelesen hab:
    https://www.c-plusplus.net/forum/332248#2462854

    Aber ausser dem Blödsinn-faktor fand ich die Idee dann doch ganz interessant.



  • Naja, delete this erfüllt genau deinen Wunsch.
    Ich habe bisher auch schon mal delete this gebraucht, als ich mit einem lockfreien Algorithmus experimentiert habe, wo man sich viele Gedanken über memory reclamation machen muss.


  • Mod

    EOP schrieb:

    SeppJ schrieb:

    EOP schrieb:

    Zurück zum Thema:
    Ich weiss immer noch nicht sicher, wie ich eine "Selbstzerstörungsfunktion" implementieren könnte.

    Definiere "Selbstzerstörung"!

    Ich möchte mich - also mein Objekt - von innen heraus zerstören/löschen.

    Die Beschreibung hilft immer noch nicht weiter. Was soll "zerstören/löschen" bedeuten? Beschreib mal die Eigenschaften, die sich verändern sollen.



  • SeppJ schrieb:

    Die Beschreibung hilft immer noch nicht weiter. Was soll "zerstören/löschen" bedeuten? Beschreib mal die Eigenschaften, die sich verändern sollen.

    Das Objekt soll einfach weg sein.
    Gibt's nicht, kenn ich nicht, usw. usf.


  • Mod

    EOP schrieb:

    Gibt's nicht, kenn ich nicht, usw. usf.

    Wie soll sich das äußern? Wer ist das "ich", das das Objekt nicht kennt? Mal angenommen das deleteme im ersten Beitrag wäre solch eine Funktion, wie sähe das von dir gewünschte Programmverhalten aus?

    Destruktoren kennst du, oder?



  • void fun()
    {
       {
          MeineKlasseKlasse x;
       }
       x.Dingsi(); // <- geht net, x ist weg
    }
    

    Ich hab' aber wiedermal den leisen (lauten) Verdacht dass du uns einfach nur verarschen willst.



  • SeppJ schrieb:

    Destruktoren kennst du, oder?

    Also

    void deleteme()
    	{
    		~registered();
    	}
    

    funktioniert schon mal nicht.

    Error 1 error C2675: unary '~' : 'main::registered' does not define this operator or a conversion to a type acceptable to the predefined operator m:\visual studio 2005\projects\testing\test\test\test.cpp 370


  • Mod

    Versuch's mal so:

    this->~registered();
    

    Das ist natürlich höchst gefährlich. Ich hoffe, du weißt, was du tust. Ich habe nämlich nicht den Eindruck. Und du hast immer noch nicht meine Gegenfragen beantwortet, was du überhaupt unter dem Löschen eines Objekts verstehst. Das Ergebnis dieser Aktion könnte eventuell recht enttäuschend sein.



  • SeppJ, es ist 3/4 3 und ich einigermaßen betrunken.
    Geht das als Entschuldigung?


  • Mod

    EOP schrieb:

    SeppJ, es ist 3/4 3 und ich einigermaßen betrunken.
    Geht das als Entschuldigung?

    Don't drink and text!



  • Och Mann, da führt euch EOP an der Nase rum, und dann fühlt sich auch noch der C-Mensch hier berufen ...

    #include <cstring>
    
    class foo
    {
        int a;
    
    public:
        ~foo()
        {
            memset(this,0,sizeof(*this)); /*Dereferenzierung vergessen!*/
        }
    
        void mach_mich_weg()
        {
            delete this;
        }
    };
    
    int main()
    {
        foo*bar = new foo;
        bar->mach_mich_weg();
        return 0;
    }
    

    Wie Jodocus allerdings schon bemerkt hat, ist es wichtig, dass das Objekt auf dem Heap liegt - sonst kracht dir das Ganze mit einem free auf den Stack zusammen (ist auch egal, ob das jetzt C oder C++ ist, bei mir kommt die Fehlermeldung aber von free. C ist C++ immer noch sehr nahe halt). Und das delete sollte die letzte Anweisung in deiner Funktion sein.

    Der Code macht erst den Speicher sauber und gibt ihn dann dem Allokator wieder zurück.
    Aber so spezifisch, wie die Aufgabenstellung aussieht, fällt mir spontan eine Art von Code ein, bei der man das haben will - Kryptocode mit einem selbstgeschriebenen Allokator, wo man sicherstellen will, dass durch eine Sicherheitslücke keine sensiblen Daten rauskommen. Teilweise mache ich das nämlich auch. :p

    Beantwortet das die Frage?


Anmelden zum Antworten