Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Iljaronaldo

Treue Seele

  • »Iljaronaldo« ist der Autor dieses Themas

Beiträge: 99

Wohnort: Hadamar

Beruf: Schüler[9.Klasse Realschule]

  • Private Nachricht senden

1

06.08.2009, 18:21

Problem mit SAFE_DELETE u. Try/Catch

Hi,

ich gucke grad das Buch nochmal durch und wollte SAFE_DELETE einsetzen.

Hier der Code erstmal(Hier ist alles was so zu Fehlerabfrage gehört):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <assert.h>

#define SAFE_DETETE(X) {if(X!=NULL){delete (X);X = NULL;}}
using namespace std;


//Klasse

class CKlasse
{
    public:
    //Konstruktor

    CKlasse()
    {
        cout<<"Neue Instanz wurde erzeugt."<<endl;
    }
    //Destruktor

    ~CKlasse()
    {
        cout<<"Instanz wurde geloescht"<<endl;
    }


};


int main()
{
    int *pZeiger = NULL;
    pZeiger = new int;

    pZeiger = NULL;

    assert(pZeiger);
    *pZeiger = 123;

    if(pZeiger != NULL)
    {
        delete pZeiger;
        pZeiger = NULL;
    }

    cout<<"Try Catch"<<endl;


    int Version = 0;

    try
    {
        Version = 5;
        if(Version <3)
        throw "Version veraltet";
        if(Version > 3)
        throw "Unbekanntes Format";


    }
    catch(char *Fehler)
    {
        cout<<"AUSNAHME AUFGETRETEN "<<Fehler<<endl;

        cout<<"Speicher wird freigegeben"<<endl;
        cout<<" und das Programm sauber heruntergefahren!"<<endl;

    }


    CKlasse *pInstanz = NULL ;
    pInstanz = new CKlasse;


    SAFE_DELETE(pInstanz);


    return 0;
}


Der Code ist eigentlich Fehlerfrei aber der Compiler spuckt folgendes Fehler aus:

Zitat

Assert\main.cpp||In function `int main()':|
Assert\main.cpp|72|error: `SAFE_DELETE' was not declared in this scope|
Assert\main.cpp|72|warning: unused variable 'SAFE_DELETE'|
||=== Build finished: 1 errors, 1 warnings ===|


Und bevor ich Safe_delete eingefügt habe, hate ich den anderen code compiliert, der lief zwar jedoch gabs bei dem Try/Catch Block keine Ausgabe der Texte.

Woran liegt das?ich benutze Code::Blocks.

Danke im Voraus.

Edit:Och man Safe_delete oben falsch geschrieben.

Aber das mit try/Catch funzt immer noch cniht.
tutti colpevole, nessuno colpevole. - Wenn einer Schuld ist, sind Alle Schuld.
Die Mafia ist wie ein Staat. Sie mordet nicht, Sie richtet hin.

Wenn man zwei Stunden lang mit einem Mädchen zusammensitzt, meint man, es wäre eine Minute. Sitzt man jedoch eine Minute auf einem heißen Ofen, meint man, es wären zwei Stunden. Das ist Relativität. (Albert Einstein)

Mein System

2

06.08.2009, 19:49

Benutze lieber gescheite exception Objekte, z.B.

http://www.boost.org/doc/libs/1_39_0/libs/exception/doc/boost-exception.html

Da hab ich mich mal kurz reingearbeitet, das Prinzip ist simpel aber man kann damit echt grandios arbeiten :)
Lieber dumm fragen, als dumm bleiben!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

06.08.2009, 20:05

Abgesehen davon dass das if(X!=NULL) sinnlos is (delete 0 funktioniert und tut per definition einfach gar nix): "Version veraltet" <- das da is ein string literal und ist vom Typ const char* und nicht char* was der Grund sein dürfte dass dein catch(char *Fehler) "nicht funktioniert". Wiederum abgesehen davon ist catch(char *Fehler) absolut grottenhässlich. Leit dir eine eigene Klasse für deine Fehlertypen von std::exception ab oder benutz zumindest std::runtime_error. Das werfen von primitiven Typen (int, pointer, ...) sollte man auf jeden Fall bleiben lassen...

Für mehr Info kannst du auch mal hier einen Blick drauf werfen: http://www.parashift.com/c++-faq-lite/exceptions.html

AriesT

Frischling

Beiträge: 24

Wohnort: Bei Frankfurt

Beruf: Azubi IT Kaufmann

  • Private Nachricht senden

4

08.08.2009, 11:41

Ein Problem mit Save_Delete habe ich auch. Bei mir meckert er, dass X nicht deklariert wurde und dass er ein ; vor dem { erwartet...

@dot:
So wirds im Buch erklärt. Dafür ist der Bereich hier schließlich da. ;)
Schau dir das Kapitel bitte nochmal an... (Kapitel 8.9)

@Iljaronaldo:
Schau mal in das Define. ;)
Du hast "SAFE_DETETE" geschrieben.

5

08.08.2009, 12:07

Zitat von »"AriesT"«


@dot:
So wirds im Buch erklärt. Dafür ist der Bereich hier schließlich da. ;)
Schau dir das Kapitel bitte nochmal an... (Kapitel 8.9)

Tja, weißt du, nicht alle Bücher sind in allen belangen gut. Auch ohne das Buch zu haben, muss ich dot zustimmen, dass es einfach grässlich ist, ein char* als Exception zu fangen.
Nimm std::exception oder leite dir davon eine Klasse ab, oder guck dir einfach boost::exception an.
Lieber dumm fragen, als dumm bleiben!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

08.08.2009, 13:09

Zitat von »"AriesT"«

@dot:
So wirds im Buch erklärt. Dafür ist der Bereich hier schließlich da. ;)
Schau dir das Kapitel bitte nochmal an... (Kapitel 8.9)


Ich kenn das Buch nicht aber geht man davon aus dass der Autor des Buches Ahnung von C++ hat (und das tu ich jetzt einfach mal), so gibt es denk ich auf jeden Fall mal drei mögliche Gründe warum das im Buch so erklärt wird:

a) weil an der Stelle im Buch Klassen noch nicht gemacht wurden,
b) weil an der Stelle im Buch Referenzen noch nicht gemacht wurden oder
c) weil der Autor zunächst nurmal den Mechanismus erklären wollte ohne einen Neuling der noch Probleme mit Klassen hat zu überfordern.

Beides durchaus legitime Gründe. Beides ändert aber nichts daran dass es furchtbarer grausamer Stil ist schon allein Pointer zu werfen und besonders ein char* dem Ganzen noch eine zusätzliche Prise Ekel verpasst. Sowas sollte man auf jeden Fall unterlassen außer man hat wirklich einen äußerst guten Grund es zu tun. Ich finde jedenfalls dass sich sowas nur sehr schlecht als Beispiel für Einsteiger eignet, gerade die wollen es ja lernen und ihnen dann gleich mal ein Negativbeispiel zu bringen halte ich für von eher zweifelhaftem Wert.
Wie gesagt kenne ich das Buch nicht aber ich hoffe doch sehr dass der Autor allerspätestens auf der nächsten Seite drauf hinweist dass das davor lediglich ein Beispiel war um den Mechanismus zu illustrieren und keinesfalls ernsthaft in dieser Form umgesetzt werden soll und etwas später im Buch zeigt wie es richtig gemacht wird.

Ich hab den obigen Code mal unter Visual Studio ausprobiert, bei mir funktionierts (nachdem man die ganze assert und Pointer Geschichte vor dem try Block auskommentiert hat versteht sich, da das assert() das Programm ja sonst schon vorher killt).

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

7

08.08.2009, 13:44

Nun, es liegt wohl eher daran, dass im Buch Ausnahmen auf ~2 Seiten (inklusive Quellcode) erklärt werden was eindeutig zu wenig ist.
Signaturen werden überbewertet

Mordrak

1x Contest-Sieger

Beiträge: 121

Wohnort: München

Beruf: Junior IT Consultant

  • Private Nachricht senden

8

09.08.2009, 13:10

Re: Problem mit SAFE_DELETE u. Try/Catch

Zitat von »"Iljaronaldo"«

#define SAFE_DETETE(X) {if(X!=NULL){delete (X);X = NULL;}}

SAFE_DELETE(pInstanz);


*hust*

Gruesse,
Mordrak
What's yellow and equivalent to the axiom of choice? The Lemmon of Zorn!

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

9

09.08.2009, 13:18

Re: Problem mit SAFE_DELETE u. Try/Catch

Zitat von »"Mordrak"«

Zitat von »"Iljaronaldo"«

#define SAFE_DETETE(X) {if(X!=NULL){delete (X);X = NULL;}}

SAFE_DELETE(pInstanz);


*hust*

Zitat von »"AriesT"«

@Iljaronaldo:
Schau mal in das Define. Wink
Du hast "SAFE_DETETE" geschrieben.

*hust*
Signaturen werden überbewertet

10

09.08.2009, 13:27

Zitat von »"Gleich im ersten Post"«

Edit:Och man Safe_delete oben falsch geschrieben.

*husthust*

Werbeanzeige