Zum Inhalt springen

Dynamisches Feld löschen


mkScheller

Empfohlene Beiträge

Hi,

wenn ich mittels

int l = 20;

int* myArr = new int[l];
ein Feld dynamisch anlege und dann später mittels
delete[] myArr;
lösche, würde ich erwarten, dass danach etwas wie
myArr[5] = 55;

zu einem Laufzeitfehler führt, allerdings ist dies nicht der Fall. Warum? Dachte der Speicher würde frei gegeben und die Variable gelöscht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Warum?

Weil solche Laufzeitüberprüfungen bei Arrays weder in C noch in C++ vorgesehen sind. Wenn Dir solche Überprüfungen wichtig sind, dann nimm keine Arrays sondern einen dafür geeigneten Container.

Dachte der Speicher würde frei gegeben und die Variable gelöscht.

Der Speicher, auf den die Pointer-Variable gezeigt hat, ist freigegeben, aber die Pointer-Variable existiert weiterhin.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der Code erzeugt undefiniertes Verhalten. Undefiniert heißt, dass alles passieren kann. Der Compilerhersteller braucht sich nicht darum zu kümmern, dass solcher Code ein definiertes Verhalten zeigt - und ein garantierter Laufzeitfehler wäre ein definiertes Verhalten.

Das ist einer der Gründe, warum C und C++ so performant sind: Es gibt fast keine automatischen Sicherheitsmechanismen, die (möglicherweise unnötig) Performance kosten könnten. Statt dessen ist es Aufgabe des Programmiers, sich um so etwas zu kümmern.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dann geht auch sowas nicht mehr.
Zugriff über einen Nullzeiger erzeugt genauso undefiniertes Verhalten wie Zugriff über einen Zeiger, der an delete übergeben wurde. Es trifft allerdings zu, dass ein Nullzeigerzugriff in der Realität meist verlässlich einen Laufzeitfehler auslöst (Access Violation / Segmentation Fault).

Sauberer ist es, auf dynamische Speicheranforderung ganz zu verzichten bzw. diese ordentlich zu kapseln - Stichwort RAII. Wenn man passende Container und Smartpointer verwendet, kann man auf new weitestgehend und auf delete komplett verzichten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zugriff über einen Nullzeiger erzeugt genauso undefiniertes Verhalten wie Zugriff über einen Zeiger, der an delete übergeben wurde. Es trifft allerdings zu, dass ein Nullzeigerzugriff in der Realität meist verlässlich einen Laufzeitfehler auslöst (Access Violation / Segmentation Fault).

Sauberer ist es, auf dynamische Speicheranforderung ganz zu verzichten bzw. diese ordentlich zu kapseln - Stichwort RAII. Wenn man passende Container und Smartpointer verwendet, kann man auf new weitestgehend und auf delete komplett verzichten.

Ne ne, der Zugriff über einen Zeiger erzeugt genauso undefiniertes Verhalten wie über einen Nullzeiger, der an insert übergeben wurde. Ne er gibt dann keine Laufzeitfehler sondern nen insert Error 14023 aus. :upps

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...