Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem mit new und delete

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 <
000
06.12.2007, 08:19 Uhr
~Franz
Gast


Hallo

hab in meinem eigenltich Programm Probleme mit new und delete nun hab ich mal ein kleines Testprogramm zum "verstehen" von diesen beiden Funktionen geschrieben

Code:
    int * bla;
    while(1){    
    bla = new int[20];
    bla[15] = 8;
    delete bla;
    }



Mit dieser kleinen Schleife müsste ich ja normaler den Speicher zu müllen.
Dies tut sie leider nicht.
Laut dieser Seite: www.cppreference.com/keywords/delete.html
müsste ich um den ganzen Speicher wieder frei zu geben ja

Code:
delete[] bla;


machen.


Warum funktioniert das delete im ersten Fall nicht richtig?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.12.2007, 09:26 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


tut es schon - nur braucht das ganze etwas weil du immer nur 20*4 bytes alloziierst, von denen du jeweils wieder 4 byte freigibst du aber im normalfall mehrere Gigabyte arbeitsspeicher und auslagerungsspeicher zur verfügung hast. Es kann auch sein das dein Compiler den Fehler mit dem delete erkennt und automatisch korrigiert.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.12.2007, 09:30 Uhr
ao

(Operator)


Weil delete (ohne []) immer genau 1 Objekt vom betreffenden Typ zerstört. Du willst aber ein Array von Int-Objekten zerlegen, und dafür gibts delete[].

delete ist für diesen Anwendungsfall:

C++:
// Objekt erzeugen
SomeObject o = new SomeObject (1, 2, 3);

// mit o arbeiten ...

// Objekt freigeben
delete o;

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.12.2007, 21:16 Uhr
xXx
Devil


Ehm nein

C++:
T* tmp(new T[size]);
delete tmp;
ist undefiniertes Verhalten ... laut Standard.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.12.2007, 21:30 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ich verstehe nicht so ganz was mir die Bemerkung von xXx in diesem Kontext sagen soll... Das ich mit so einem Beispiel "Verschiebibus" des Problems in Richtung des Destruktor spiele mag ja schön und gut sein aber was hat das mit der Frage bzw ao's Antwort zu tun?

Leuchtet mir gerade nicht ein...

Kommt mir irgendwie so vor wie die Frage

"Wissen Sie wie spät es ist" und die Antwort ist "Wir haben es 23 Grad Celsius". Die Antwort/Aussage ist sicherlich nicht falsch aber es ist nicht die Antwort auf die Frage... Oder was verstehe ich da gerade nicht...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.12.2007, 21:51 Uhr
0xdeadbeef
Gott
(Operator)


Dass das undefiniertes Verhalten erzeugt, bedeutet, dass der Compiler daraus alles mögliche machen darf. Ich vermute, dass in diesem speziellen Fall der Compiler den gesamten Speicher freigibt, vorher aber nur einen Destruktor ausführt. Oder ausführte, wenn es denn einen gäbe.

Das ist aber alles ziemlich nutzlose Raterei, denn der Compiler darf dir bei sowas genausogerne ein Programm ausspucken, das dann einen segfault auslöst, oder zufällig genau macht, was du willst, oder dir die Festplatte formatiert. Insofern ist xXxs Antwort durchaus richtig und relevant - es ist in etwa so, als antwortete man auf die Frage "Wenn ich nen Würfel werfe, krieg ich dann ne zwei oder ne fünf" mit "Woher zum Teufel soll ich das wissen?"
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 06.12.2007 um 21:52 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: