Article View: de.comp.lang.c++
Article #1264Re: Ueberladen ... Problem ... Dringend
From: Claus Faerber
Date: Sun, 14 Jan 1996 09:44
Date: Sun, 14 Jan 1996 09:44
68 lines
3118 bytes
3118 bytes
Joern Sierwald <Sierwald@tu-harburg.d400.de> schrieb zu
Re: Ueberladen ... Problem ... Dringend
in Artikel <30F50BC9.754D@tu-harburg.d400.de> vom 11.01.96:
> Dietmar Kuehl wrote:
>
> > Hi,
> > Karsten Baensch (kba@hrz.tu-chemnitz.de) wrote:
> > : Selbst der Destruktor ist nicht ganz korrekt. Es muss heissen:
> > : vektor::~vektor()
> > : {
> > : delete[] pointer;
> > : }
> > : (Fuer den Fall des int-Arrays haette der 'normale' delete-Operator
> > : vielleicht auch funktioniert.
>
> > * N * E * I * N * !!!! Auf Array Objects MUSS IMMER delete[] angewendet
> > werden! IMMER! KEINE AUSNAHME! Das es uU. mit einem bestimmtem
> > Compiler funktioniert heisst nicht, dass es "vielleicht auch
> > funktioniert"!
>
> Cool bleiben. Sag mir auf welchem Compiler/System
>
> char* s= new char[10];
> delete s; // Also ohne []
>
> schiefgeht. Na komm, irgendeins. Und wenn du keins findest, dann
> sag doch mal, was schiefgehen KOENNTE.
Ich bin zwar jemand anders, aber da kann EINIGES schiefgehen:
Weil der Compiler nicht weiss, dass es sich nicht um ein Array
handelt, wird new mit dem Parameter sizeof(int) aufgerufen, gibt
also nur _einen_ int frei.
Wenn Du [] schreibst, wird das ganze fuer ein Array aufgerufen,
hier muss dann irgendjemand die Groesse des Arrays (die bei den
meisten Compilern bei *(((size_t*)s)-1) stehen duerfte)
herausfinden und dann den globalen new-Operator mit dem Parameter
sizeof( int ) * <anz. Elemente> + <evt. zusatzlicher Speicher zum
Speichern der Arraygroesse> aufrufen.
Ist die Speicherverwaltung nicht besonders optimiert, speichert
sie natuerlich auch bei nicht-Arrays die Groesse des Objekts in
Bytes ab, dann ist's voellig egal, aber Du kannst nie davon
ausgehen, dass gerade dein Compiler nicht doch ein Speicherleck
produziert.
Und wenn C schon so eine Syntax zum Unterscheiden von Arrays und
einzelnen Variablen definiert, sollte man sie auch benutzen.
Sonst kommt womoeglich eine boese Ueberraschung, wenn Du den
Compiler oder auch nur die Speicherverwaltung wechselst.
> Es wird schliesslich in beiden
> Faellen derselbe globale operator new aufgerufen. (AT&T 2.1, komm jetzt
> nicht
> mit irgendwelchen ANSI C++ Gags).
Was soll das nun wieder heissen? Willst Du vielleicht behaupten,
irgend so ein AT&T Firmenstandard waere das einzig gueltige C++ ??
> Joern
Claus
------------------------------------------------------------------------
Claus Andre Faerber - claus@faerber.muc.de - http://www.muc.de/~cfaerber
>>> Windows - best before 95 <<<
------------------------------------------------------------------------
Technical Details
Message-ID:
<60prT19JcDB@faerber.muc.de>Path:
arc1-ca.pugleaf.net!faerber.muc.de!clausReferences:
<4cqs22$2ou@rztsun.tu-harburg.de> <4ctel8$fv8@pyrrhus-f.hrz.tu-chemnitz.de> <30f2a556.0@news.uni-konstanz.de> <30F50BC9.754D@tu-harburg.d400.de>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!faerber.muc.de!claus Date: 14 Jan 1996 10:44:00 +0100 From: claus@faerber.muc.de (Claus Faerber) Newsgroups: de.comp.lang.c++ Message-ID: <60prT19JcDB@faerber.muc.de> References: <4cqs22$2ou@rztsun.tu-harburg.de> <4ctel8$fv8@pyrrhus-f.hrz.tu-chemnitz.de> <30f2a556.0@news.uni-konstanz.de> <30F50BC9.754D@tu-harburg.d400.de> Subject: Re: Ueberladen ... Problem ... Dringend X-Newsreader: CrossPoint v3.1 R/B17071