Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » 1. Montagsrätsel

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 <
010
15.10.2002, 23:16 Uhr
void*
Generic Pointer
(Operator)


Hallo!

1. Ich habe nicht gesagt, dass das Programm abstürzt es wird durch std::terminate() beendet.
2. Ihr müsst lesen was ich schreibe:
Wenn ein dtor während des stack unwinding eine Ausnahme wirft. Also so:


C++:
#include <iostream>

class X
{
public:
    virtual ~X() { throw "Hallo"; };
};

class Y
{
public:
    ~Y() { throw "Ouch!"; }
};

int main()
{
    try
    {
        Y y;
        X* x = new X;
        delete x; // dtor hier
    }
    catch(...)
    {
    }

    std::cout << "Normales Program Ende" << std::endl;
}



Was steht in der Konsole?

abnormal program termination

Siehe auch: Bjarne Stroustrup: Die C++ Progammiersprache.

Gute Nacht!
void*
--
Gruß
void*
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
15.10.2002, 23:20 Uhr
void*
Generic Pointer
(Operator)


Noch krasser:

Der Z dtor wird nie ausgeführt:

C++:
#include <iostream>

class X
{
public:
    virtual ~X() { throw "Hallo"; };
};

class Y
{
public:
    ~Y() { throw "Ouch!"; }
};

class Z
{
public:
    ~Z() { std::cout << "Ich bin der Z-dtor"; }
};

int main()
{
    Z z;
    try
    {
        Y y;
        X* x = new X;
        delete x; // dtor hier
    }
    catch(...)
    {
    }

    std::cout << "Normales Program Ende" << std::endl;
}



Gruß
void*
--
Gruß
void*
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
16.10.2002, 12:23 Uhr
~0xdeadbeef
Gast


Der Speicher wird aber trotzdem wieder freigegeben. Gut, es sieht nicht sonderlich schön aus, aber es ist nur dann wirklich schlimm, wenn du wichtigen Code im Destruktor hast, und das sollte man tunlichst vermeiden...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
16.10.2002, 12:43 Uhr
void*
Generic Pointer
(Operator)


1. Wer garantiert Dir das der Speicher auf jeder Platform freigegeben wird?
2. Das gleiche für andere Ressourcen
3. Schlechter Programmierstil
4. Das Programm bricht unaufhaltsam ab. Das ist immer unschön darf aber ggf. nicht geschehen (z.B. medizinische Anwendung)
--
Gruß
void*
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
16.10.2002, 12:51 Uhr
~0xdeadbeef
Gast


1. Ich code objektorientiert, das heisst, ich kümmer mich um meinen Dreck, das System sich um die Speicherverwaltung.
2. jepp.
3. Schlechter Programmierstil ist nicht verbotener Programmierstil.
4. Jepp. Das gilt aber für alle ungefangenen Exceptions.

Grüße,

0xdeadbeef
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
16.10.2002, 13:53 Uhr
void*
Generic Pointer
(Operator)


1. Das hat nichts mit OOP zu tun, wenn durch Deinen Fehler das System Ressourcen verliert. OOP heisst nicht das ich mich um Speicherverwaltung nicht kümmern muss. C++ bietet keinerlei garbage collection, weder für Speicher noch für andere Ressourcen. Bloss weil Windows und Linux, den Speicher den ein beendeter Prozess belegt hatte freigeben, beduetet das nicht, dass ein anderes OS das auch tun/muss oder kann. Wenn Du Deine Ressourcen nicht aufräumst fliegst Du irgendwann mal auf die Schnauze, auch unter Windows, Linux und co. C++ bietet aber die Unterstützung (dtoren!) verwendete Ressourcen automatisch (d.h. ohne expliziten Aufruf) wieder freizugeben.
2. siehe 1.
3. Schlechtes Autovefahren heisst nicht verbotenes Autofahren. Dennoch baut ein schlechter Autofahrer eher einen Unfall und/oder verschleisst sein eigenes Fahrzeug schneller.
4. Mit einem try-catch-Block (z.B. in main) kann ich Ausnahmen aller Art fangen und mir sicher sein, dass das Programm zumindest sauber beendet wird. Eine Ausnahme in einem dtor, die der nicht selber fängt, bricht mir aber das Genick. Die hält keiner mehr auf. Und was nützt mir eine Exception die ich nicht fangen kann? Das ist doch quatsch.
--
Gruß
void*
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
16.10.2002, 14:36 Uhr
~0xdeadbeef
Gast


Du hast im Grunde in allen Punkten recht, aber die Frage war, welche Methoden nie eine Exeption werfen dürfen - und das ist bestenfalls compilerabhängig. Wie's im Standard steht, bin ich grad nicht sicher.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
16.10.2002, 14:55 Uhr
void*
Generic Pointer
(Operator)


So weit ich weiss schränkt der Standard das Exception-Werfen gar nicht ein.
Also bin ich davon ausgegangen, dass virtual mit seiner Frage auf den guten Stil und nicht die Syntax abgezielt hat.
Wo ist eigentlich virtuals Antwort???
--
Gruß
void*
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
16.10.2002, 15:09 Uhr
~0xdeadbeef
Gast


Wurde der Thread nicht von einem Möchtegern-CPP-Master eingeleitet ;-D ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
16.10.2002, 17:44 Uhr
will_cpp_master_werden




Zitat:
~0xdeadbeef postete
Wurde der Thread nicht von einem Möchtegern-CPP-Master eingeleitet ;-D ?

Wer redet denn da über mich ?
Habe leider bis Ende der Woche nur ganz wenig Zeit, sorry. Werde mich dann wieder zum thema melden. Ich gebe in den Wesentlichen Punkten void* recht.
--
mfg will_cpp_master_werden (aka virtual)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ Rätselecke ]  


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: