deleteme - wieso funktioniert das nicht?
-
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.

-
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#2462714Von 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#2462714Von 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.
-
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#2462854Aber 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.
-
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.
-
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
-
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?
-
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. :pBeantwortet das die Frage?
-
Um das ein- für allemal zu sagen:
Das war nicht als Verarschung oder Trollversuch gedacht (weil ich solche Kindereien grundsätzlich nicht mache - ich mach mich höchstens manchmal über Vollidioten lustig).
Es war eine ernsthaft gemeinte Sache.
Wie gesagt, die Idee kam mir nachdem ich "Bitte meinen account löschen" gelesen hatte.@dachschaden_off:
Mit nem Zeiger könnte ich das natürlich auch. Will ich aber nicht.
-
EOP schrieb:
@dachschaden_off:
Mit nem Zeiger könnte ich das natürlich auch. Will ich aber nicht.Naja, hier ist aber das Problem der Speicherverwaltung, nicht? Ein Objekt liegt entweder auf dem Stack (semi-statisch), oder auf dem Heap (dynamisch), oder in einem Datensegment (komplett-statisch). Wenn die Daten statisch liegen, hast du keine Chance, nachträglich kannst du das Objekt nicht entfernen (außer mit einem perversen Eingriff auf Betriebssystemebene, in dem du die eingebundenen Pages modifizierst, und das ist hässlich und muss nicht mal funktionieren, schon gar nicht, wenn dein Feld in der Segmentmitte auftaucht, dann hast du komplett verloren). Wenn die Daten auf dem Stack liegen, sind ist das Objekt nach dem return wieder weg. Explizit freigeben geht nicht. Das hat einigen bereits das Genick gebrochen, die sich mit alloca schlau vorkamen.
Bei statischen/semi-statischen Feldern kannst du das Objekt nur nullen, mehr nicht. Und dann hast du halt ein Loch da. Unbenutzt. Aber vorhanden. Und kannst auch wieder reinschreiben, ohne extra Speicher anzufordern. Aber wirklich an das OS freigeben geht nicht. Nur bei Speicher auf dem Heap kannst du nullen und dann wirklich freigeben. Hier kollidiert "wollen" mit "können". Deswegen vermute ich immer noch, dass du hier trollen willst. :p Für so unbefangen in der Speicherverwaltung halte ich dich nicht.
-
Addendum:
EOP schrieb:
Objekt x gibt aber immer noch hello() aus.
Wie lösche ich mich also selbst?
Hatte ich gar nicht mehr auf dem Kasten, dass du das auch machen wolltest.
Schlichte Antwort: hello() wirst du immer aufrufen können. Das verlangt meines Wissens die thiscall-Calling Convention. Wie die genau aussieht, ist vom Compiler abhängig - aber überall gilt: er fasst dein Objekt nicht mal an, sondern nur die Adresse auf nicht (mehr) reservierten Speicher. Aber solange du nicht auf this innerhalb von hello() zugreifst, ist ja alles paletti.Vielleicht hilft es, sich für diesen Kasus vorzustellen, dass eine Klasse halt auch nur eine Struktur ist wie in C. Die einfach nur Felder, Variablen hat. Und die Methoden werden übersetzt in spezielle Funktionen, die einen Zeiger vom Typen der Klasse (this-Zeiger) übernehmen. Vererbung und Templates mal ganz ignoriert.
include <cstring> #include <iostream> class foo { int a; public: void ahoy() { std::cout << "Ahoy! Dette is mein this-Zeiger: " << this << std::endl; } }; int main() { foo*bar = NULL; bar->ahoy(); }Hier war das Objekt nie initialisiert, und ich kann dennoch ahoy() aufrufen.