mkScheller Geschrieben 19. August 2008 Teilen Geschrieben 19. August 2008 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 19. August 2008 Teilen Geschrieben 19. August 2008 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 19. August 2008 Teilen Geschrieben 19. August 2008 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 20. August 2008 Teilen Geschrieben 20. August 2008 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 20. August 2008 Teilen Geschrieben 20. August 2008 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tuni Geschrieben 22. August 2008 Teilen Geschrieben 22. August 2008 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.