Angenommen, ich führe eine Endlosschleife (Sentinel) aus, in der es einen uninitialisierten Zeiger gibt, der nach jeder einzelnen Ausführung der Schleife gelöscht wird, So ist die Frage, ob der Zeiger auf Systemvariablen zugreifen kann verwendet, um den Computer zu betreiben? Nun, ich suchte nach seiner Antwort und fand eine enge über dangling Zeiger, aber die Antworten nicht angeben, ob es Zugriff auf die Systemvariablen haben kann oder nicht, und auch wenn es hat, kann es gelöscht werden, um ein Problem auf dem Computer zu verursachen ist irreparabel? Edit :(Ich denke, dass ich einen falschen Eindruck über meine Zweifel an den Lesern erstellt habe, habe ich nie wirklich zu tun oder getan haben, aber wenn eine solche Bedingung entsteht, was passieren würde? Ist meine Frage.)Was passiert, wenn eine nicht initialisierte Zeigervariable in einer Endlosschleife gelöscht wird?
Was passiert, wenn eine nicht initialisierte Zeigervariable in einer Endlosschleife gelöscht wird?
Antwort
n diesem Fall Das Programm hat ein undefiniertes Verhalten. Wenn der Zeiger mit 0 initialisiert wird, dann ist alles O'k.
initialisiert von null –
['nullptr'] (https://isocpp.org/wiki/faq/freestore-mgmt#null-oder-zero) ist sicher wette. – user1336087
@ user1336087: Kein sicherer als "0", aber besser lesbar. –
Was passiert, wenn ein uninitialised Zeigervariable ...
gelöscht
Unter der Annahme, dass durch „gelöscht“ Sie so etwas wie delete ptr;
bedeuten, ist das Verhalten nicht definiert. Wenn Sie fragen, ob X passieren könnte, ist die Antwort ja, für jeden physikalisch möglichen Wert von X. (Betriebssysteme haben Schutzmaßnahmen vor Rogue-Verhalten durch einzelne Programme. Diese Maßnahmen sind nicht 100% zuverlässig.)
... in einer Endlosschleife?
Das macht keinen Unterschied.
"Die Antwort ist ja, für jeden physikalisch möglichen Wert von X" ist das rein theoretisch, in der Praxis würde das nicht passieren. So wie unendliche Affen komplette Werke von William Shakespeare erzeugen würden. – Slava
@Slava: In der Praxis * was * würde nicht passieren? Wenn X, wie das OP fragt, auf Systemvariablen zugreift, dann könnte es * passieren, wenn die OS-Sicherheitsvorkehrungen fehlschlagen - oder wenn es kein Betriebssystem gibt, wie bei einem kleinen eingebetteten System. Eine unendliche Anzahl von Affen * würde die vollständigen Werke von Shakespeare eingeben; Finde mir eine unendliche Anzahl von Affen (und Schreibmaschinen) und ich werde es beweisen. –
Bitte nicht, @Keith. Es könnte genauso gut meine Katze aus der Ferne töten, von der ich eher begeistert bin. –
Es hängt vom Betriebssystem ab. Für gute alte DOS ist dies möglich, aber sehr unwahrscheinlich (wahrscheinlich würde Ihr PC einfach abstürzen, so dass Sie nur neu starten müssen), für moderne Betriebssysteme ist dies nahezu unmöglich, da normaler Prozessspeicher vom System isoliert ist und Sie nicht darauf zugreifen können. Obwohl einige Programme Sicherheitsverletzungen ausnutzen können, um Systemdaten zu modifizieren, ist es sehr unwahrscheinlich, dass dies durch zufällige, sich schlecht verhaltende Prozesse geschieht.
Sie erwähnt haben das Wort delete
, Sie delete
, was Sie new
verwendet haben zugewiesen, so in Ihrem Fall, wie Sie einen nicht initialisierten Zeiger löschen das Ergebnis wird nicht definiertes Verhalten (UB) sein.
Sie tun es in einer Endlosschleife: Sie erhöhen nur die Chancen von UB!
Sie können mehr über memory management auf https://isocpp.org lesen
double-delete-disaster
Die Chance ist 100% von Anfang an und kann nicht erhöht werden. –
- 1. Was passiert, wenn ein Framework aus einer App gelöscht wird?
- 2. Was passiert, wenn eine App übersendet wird?
- 3. Wenn ThreadLocal-Variable nicht gelöscht wird, was wird passieren?
- 4. Was passiert mit einer vorhandenen DB2-Sicht, wenn die Tabelle gelöscht wird?
- 5. Was passiert, wenn Rekursion in einer Methode zweimal aufgerufen wird?
- 6. Was passiert, wenn eine Nachricht in MQ zurückgesetzt wird?
- 7. Wird eine nicht initialisierte Variable in einer Funktionsparameterliste definiert?
- 8. Was passiert, wenn ein Prozess gespalten wird?
- 9. Was passiert, wenn ein Ereignis ausgelöst wird
- 10. Was passiert, wenn NSTimer in
- 11. Was passiert, wenn veröffentlicht
- 12. Was passiert, wenn dieser Code ausgeführt wird?
- 13. Was passiert, wenn auf eine bereits abgeschlossene Aufgabe gewartet wird?
- 14. Was passiert, wenn die() innerhalb einer Funktion aufgerufen wird
- 15. Was passiert, wenn wir eine Webseite aktualisieren?
- 16. Was passiert, wenn eine neue Instanz eines Objekts aufgerufen wird?
- 17. Was passiert mit Einschränkungen, wenn eine Ansicht entfernt wird
- 18. Was passiert, wenn Sie einer rvalue-Referenz eine Literalkonstante zuweisen?
- 19. Was passiert, wenn ich eine Ausnahme erstelle?
- 20. Was passiert, wenn eine Scala "Future" Müll gesammelt wird?
- 21. Was passiert, wenn eine JSP Ausführung beendet?
- 22. Verstehen Pull-Anfragen auf GitHub: Was passiert, wenn das anfordernde Repository gelöscht wird?
- 23. Was passiert, wenn Kernel delayed_work
- 24. Was passiert, wenn Sie "this" nicht innerhalb einer Klasse verwenden?
- 25. Was passiert, wenn make_shared
- 26. Was passiert, wenn ich eine AliasProperty anbinde?
- 27. Was passiert mit einer nicht geschlossenen Datenbankverbindung?
- 28. Was passiert genau in AngularJS, wenn die Seite aktualisiert wird?
- 29. Was genau passiert, wenn my_object gelöscht wird; wird ausgeführt? Wird der gesamte übrige Speicher um sizeof (MyClass) nach links verschoben?
- 30. Was passiert, wenn während einer Signalverarbeitung in UNIX das gleiche Signal an das Programm gesendet wird?
Sie den gleichen Zeiger immer und immer wieder zu löschen? oder Sie malloc(), nie initialisieren, und dann frei() es? –
@MarcB hat einen guten Punkt: Könntest du genauer sein, was machst du mit dem Zeiger? Können Sie die Antwort verknüpfen, auf die Sie sich beziehen? –
Nein, ich würde nie so etwas tun, aber wenn das Programm einen Weg hat, ein solches Verhalten auszuführen, was würde dann passieren? Das war meine Frage. Entschuldigung, wenn ich meine Zweifel nicht geklärt habe. –