Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Dynamisches Feld löschen

Empfohlene Antworten

Veröffentlicht

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.

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.

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.

Wenn der/die/das Array nicht mehr gebraucht wird und ge-delete-t wurde, sollte man nach Möglichkeit den Array auf NULL setzen.

Dann geht auch sowas nicht mehr.

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.

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.