Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » delete[] funktioniert nicht

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
27.02.2005, 17:18 Uhr
nullDog



Hallo zusammen,
Ich komme einfach nicht weiter und verstehe C++ nicht mehr ;-)

Folgendes ist mein Problem:

Code:
char * buffer = new char[size];

file.read(buffer,size);

for(int ahh = 0; ahh < 10; ahh++)
    delete[] buffer;



Der obige code bringt keine Fehler, obwohl ja eigentlich ein Fehler auftreten sollte, wenn man bereits feigegebenen Speicher nochmals freigeben möchte.

Mich würde interessieren, ob jemand von euch solch ein Verhalten schon einmal beobachtet hat bzw es sich/mir erklären kann.


Background:
Ich entwickle eine Adventure-Engine und nutze dazu C++, SDL und LUA.
OS: Windows2000
IDE: MSVC++

Ich habe zum Test ein kleines Testprogramm entwickelt und dort funktioniert der Code.
Der Speicher wird freigegeben und bei der destruktiven for-schleife gibts auch nen schönen Fehler.
Der Code ist in beiden Programmen 100% identisch, und dennoch verhalten sie sich nicht gleich.

Ich hoffe ihr habt mein Problem verstanden und könnt helfen, ich bin ziemlich abgenervt
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.02.2005, 17:52 Uhr
virtual
Sexiest Bit alive
(Operator)


Das ist undefiniertes Verhalten. Der Compiler darf machen, was er will.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.02.2005, 18:10 Uhr
nullDog



Was meinst Du genau damit ?

Bis auf die for-Schleife ist der code dpch in Ordnung.
Die Schleife habe ich nur zum Test eingebaut, weil ich eindeutige Memory-leaks habe.
Na ja, zumindest gibt mir die folgende Funktion bei Beendigung des Programmes
ne Menge Leaks aus.

Code:
void DetectMemoryLeaks()
{
   _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF|_CRTDBG_ALLOC_MEM_DF);
   _CrtSetReportMode(_CRT_ASSERT,_CRTDBG_MODE_FILE);
   _CrtSetReportFile(_CRT_ASSERT,_CRTDBG_FILE_STDERR);
}



Da hab ich mich mal drauf verlassen, dass das stimmt.


Um meine Frage zu präzisieren:

Warum wird der Speicher hier nicht freigegeben ?


Code:
char * buffer = new char[size];

file.read(buffer,size);

delete[] buffer;

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.02.2005, 18:26 Uhr
Pablo
Supertux
(Operator)


das bedeutet, dass das Standard keine Vorschrift für die Freigabe von freigegeben Speicher macht. Und deshalb ist das Verhalten undefiniert und der compiler darf machen, was er will.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
27.02.2005, 18:35 Uhr
nullDog



Dass heißt man kann nicht davon ausgehen, dass der Speicher auch freigegeben wird.
Aua. Sowas sollte in nen Standard aber rein finde ich
Ich werde mich mal an die Verantwortlichen wenden, so gehts ja nicht, ;-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
27.02.2005, 18:50 Uhr
Pablo
Supertux
(Operator)


nein, der Speicher wird freigegeben. Was nicht gesagt ist, was passiert, wenn du ihn nochmal zum Freigeben gibst. Was C++ diesbzgl. sagt (mit delete[] ) weiß ich nicht, unter C passiert jedenfalls nicht (zumindest mit dem gcc)


C++:
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    char *x;

    x = malloc(1);

    free(x);
    free(x);

    printf("Hallo\n");

    return 0;
}



erzeugt bei mir kein Laufzeitfehler und Hallo wird ausgegeben.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
27.02.2005, 18:54 Uhr
nullDog



Ach das war gemeint, ok.

Was sollte denn passieren, wenn ich wie im beispiel oben den buffer freigebe und ihn dann einfach zum Spass später weiter verwende ?
Ich meine da sollte es einen Fehler geben.

Bei mir gibt es aber leider keinen Fehler =(
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
27.02.2005, 19:57 Uhr
virtual
Sexiest Bit alive
(Operator)


Nein: das gleiche: undefiniertes Verhalten. Warum sollte Der Standard definieren, wie fehlerhafte Programme laufen sollen? Es ist schon schwer genug, zu beschreiben, was korrekte Programme tun sollen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
27.02.2005, 20:04 Uhr
nullDog



Na gut, jedoch bleibt der Speicher trotzdem alloziert und wird im Laufe der Zeit immer mehr.
Das dachte ich eigentlich mit delete[] verhindern zu können.
Und die oben genannte Funktion ( void DetectMemoryLeaks() ) spuckt hunderte Leaks aus.

Weiß denn niemand einen Rat ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
27.02.2005, 22:05 Uhr
0xdeadbeef
Gott
(Operator)


Ich würd an deiner Stelle mal valgrind bemühen, das spuckt mehr Informationen aus. Gibts das für Windoze überhaupt? Naja - im Zweifel wirds bei cygwin dabei sein.

Was das Weiterbenutzen von freigegebenem Speicher betrifft - naja, das Betriebssystem wird sich in der Regel nicht die Mühe machen, einzelne Speicherbereiche zu flaggen, ob du reinschreiben darfst oder nicht, sondern lediglich prüfen, ob du in die Speicherpage, in die du schreiben willst, schreiben darfst. Dementsprechend sind buffer overflows und das benutzen bereits gelöschter Buffer in ihrem Verhalten ziemlich unberechenbar, vgl. Heisenbug.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: