2016-07-15 7 views
1

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?

+0

Sie den gleichen Zeiger immer und immer wieder zu löschen? oder Sie malloc(), nie initialisieren, und dann frei() es? –

+0

@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? –

+0

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. –

Antwort

0

n diesem Fall Das Programm hat ein undefiniertes Verhalten. Wenn der Zeiger mit 0 initialisiert wird, dann ist alles O'k.

+0

initialisiert von null –

+1

['nullptr'] (https://isocpp.org/wiki/faq/freestore-mgmt#null-oder-zero) ist sicher wette. – user1336087

+0

@ user1336087: Kein sicherer als "0", aber besser lesbar. –

4

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.

+0

"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

+1

@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. –

+0

Bitte nicht, @Keith. Es könnte genauso gut meine Katze aus der Ferne töten, von der ich eher begeistert bin. –

0

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.

0

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

+0

Die Chance ist 100% von Anfang an und kann nicht erhöht werden. –

Verwandte Themen