Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Exceptions

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 ]
010
04.02.2004, 20:22 Uhr
virtual
Sexiest Bit alive
(Operator)


@Windalf:

Jetzt mal losgelöst von der Frage Constructor oder nicht:

C++:
void func()
{
   char* x = new char[100000];
   char* y = new char[100000];

   ...
   delete[] x;
   delete[] y;
}


Nehmen wir mal an, daß das new für y schief gegangen wäre. Ein ANSI C++ kompatibler Compiler würde hier eine std::bad_alloc Exception werfen (der VC übrigens nicht!). Nun ist die Situation ja die, daß Du ein Speicherloch hast, weil für x schon Speicher belegt wurde und durch die Exception die Funktion verlassen wird.
Wir wollen ja eigentlich zwei Dinge: zum einen wollen wir das Speicherloch vermeiden (dh. x freigeben) und gleichzeitig wollen wir, daß die Exception durchgereicht wird, also an den Aufrufer von f gelangt. Dies kann man nur dadurch hinbekommen, daß man die Exception zunächst in f fängt und dann auch wieder throwt (das habe ich im letzten Post vergessen, bin heute leider nicht ganz bei mir):

C++:
void func()
{
   char* x = NULL;
   char* y = NULL;

   try
   {
       x = new char[100000];
       y = new char[100000];
   }
   catch(...) // ... fängt jede Exception
   {
       // Vermeide Speicherlöcher durch Freigabe. delet kommt auch mit NULL pointern klar!
       delete [] x;
       delete [] y;
       // Reiche die Exception weiter:
       [b][u]throw[/u][/b]
   }
}


Analog sollte Dein Constructor aufgebaut sein. Beim Constructor kommt eben nur eine Besonderheit hinzu: Wird er mit einer Exception verlassen, werden die Destructoren der ggf. vorhandenen Basisklassen implizit aufgerufen.
--
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
011
04.02.2004, 20:39 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ok
ich fass mal nochmal zusammen ob ichs richtig verstanden habe...

das mit der Exception innerhlab der Klasse kann ich mir auch schenken indem ichs z.b. so machen


C++:
void func(){
   char* x = NULL;
   char* y = NULL;

   x = new char[100000];
   y = new char[100000];

   if(x==NULL || y==NULL){ delete [] x; delete [] y; throw;}
   }
}


oder geht das nicht? wenn warum nicht also ich würde das immer so machen find ich übersichtlicher... wenns ichs jetzt richtig verstanden habe werden dann in diesem fall(wenn x oder y auf null zeigt) noch alle destruktoren der basisklassen aufgerufen aber nicht der destruktor der klasse selbst...richtig?

so und wenn ich jetzt mach


C++:
MyClass *mc=NULL;
try{
mc = new MyClass(...);
}
catch(...){

}


springt der mir in der catchblock wenn das allokieren nicht geklappt hat und ich muss mich um nichts mehr weiter kümmern als um den catchblock selber...richtig?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
04.02.2004, 21:46 Uhr
(un)wissender
Niveauwart


@windalf
Nein, so geht das nicht!
Was passiert denn, wenn beim zweiten new eine exception auftritt?
Die Funktion wird verlassen und deine if-Abfarge nie erreicht!
Also Speicher nicht freigegeben.
Entweder du nimmst auto bzw. smart_ptr oder du machst es so wie von virtual vorgeschlagen.

zum zweiten:
Ja, du musst in diesem Fall nichts tun, auch nicht löschen.
Evtl. im catch-Block irgendwas tun, damit dein Programm weiter funzt, weil du ja den Speicher nicht bekommen hast.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
04.02.2004, 21:49 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@unwissender
ach ja der echt ansi-compiler wirft ja ne exception... aber mein vc macht das ja nicht...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
04.02.2004, 21:49 Uhr
(un)wissender
Niveauwart


Das wäre sicher, weil der Destructor vom auto_ptr löscht, wenn was schief geht:


C++:
void func(){
   auto_ptr<char*> x(new char[100000]);
   auto_ptr<char*> y(new char[100000]);
}


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
04.02.2004, 21:54 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


hm also irgendwie find ich besser wenn der compiler nicht einfach eine exception wirft ohne mich zu fragen...
dann zwingt der mir ja sein konzept auf...das gefällt mir gar nicht... da gefällt mir das vom vc besser(nicht weil ich jetzt den vc loben will oder sowas aber ich mag nicht wenn mir vorgeschrieben wird wie ich das zu proggen habe)
wenn ich mich in meinen möglichkeiten beim proggen einschränken lassen wollte würde ich ja schliesslich nicht c sondern java nehmen...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
04.02.2004, 23:24 Uhr
(un)wissender
Niveauwart


Na ja, du kannst mit new (nothrow) char[1000000], erreichen, das, wenn was schief geht, null zurück geliefert wird, ist dann auch ANSI und nicht VC-ICHMACHEMIRSELBSTMEINENSTANDARD.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
04.02.2004, 23:26 Uhr
(un)wissender
Niveauwart


He, Java ist nicht schlecht!
Nur ein wenig langsam, aber dafür absolut umfangreich und immer verfügbar.
Und sicher!
Gut C/C++ ist viel mächtiger, aber im Applikationsbereich kann man fast alles mit Java machen.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
04.02.2004, 23:34 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


hmm also mit nothrow kann man das wieder umgehen... sehr schön... woher weisst du das alles...Der heutige Tag hat mir mal wieder deprimierender Weise gezeigt das ich bisher nur einen ganz ganz kleinen Teil der Programmierung wirklich verstanden hab und noch extrem viel zu lernen habe...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
05.02.2004, 09:07 Uhr
(un)wissender
Niveauwart


Ich habe einige Bücher zu Thema C++ gelesen, das hilft.
Aber schau dir virtual an, der ist um Klassen besser, aber er hat auch mehr Bücher gelesen.
Na ja, dafür bist du, glaube ich, in Mathe einen Tick besser als ich.
Aber als BWLer bist du ein extrem kompetenter Programmierer, das muss ich schon sagen.
--
Wer früher stirbt ist länger tot.
 
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: