C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Dereferenzieren von NULL / Standard-Exceptions

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
F. Bugauer
Guest





PostPosted: Mon May 10, 2004 3:16 pm    Post subject: Dereferenzieren von NULL / Standard-Exceptions Reply with quote



Hallo

Ich arbeite erst seit Kurzem unter C++ mit Exceptions und versuche nun
schon einige Stunden, einen Codeabschnitt zum Laufen zu bringen.
Offensichtlich habe ich mir aber etwas falsch überlegt: Ich habe
meinen Denkfehler auf folgendes kleines Beispiel eingeschränkt:

// irgendwo im Code

MyClass * m; // oder auch: MyClass * m = NULL;
try {
m->printList();
}
catch (std::exception & e){
cout << "Exception: " << e.what();
}

Meiner Ansicht nach müsste m-> eine Standardexception auslösen, da
versucht wird, NULL zu dereferenzieren. Leider komme ich aber nicht in
den catch-Teil hinein, das ganze bricht direkt ab.
Ich kann mir kaum vorstellen, dass ich unter c++ jedes Dereferenzieren
manuell überprüfen muss um ggf. eine Exception zu werfen. Leider habe
ich nur sehr wenig zu den Standardexceptions im Netz gefunden und bin
daher auf Eure Hilfe angewiesen.

Wo liegt mein Denkfehler?
Herzlichen Dank im Voraus

Florian

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Stefan Reuther
Guest





PostPosted: Mon May 10, 2004 4:44 pm    Post subject: Re: Dereferenzieren von NULL / Standard-Exceptions Reply with quote



F. Bugauer wrote:
Quote:
MyClass * m; // oder auch: MyClass * m = NULL;
try {
m->printList();
[...]
Meiner Ansicht nach müsste m-> eine Standardexception auslösen, da
versucht wird, NULL zu dereferenzieren.

C++ != Java.

Dereferenzieren von NULL hat undefiniertes Verhalten und wirft nur in
den allerseltensten Fällen eine Ausnahme. Du must das testen-und-werfen
schon selber übernehmen.


Stefan

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Martin Winkler
Guest





PostPosted: Mon May 10, 2004 4:53 pm    Post subject: Re: Dereferenzieren von NULL / Standard-Exceptions Reply with quote



F. Bugauer schrieb:
Quote:
Hallo

Ich arbeite erst seit Kurzem unter C++ mit Exceptions und versuche nun
schon einige Stunden, einen Codeabschnitt zum Laufen zu bringen.
Offensichtlich habe ich mir aber etwas falsch überlegt: Ich habe
meinen Denkfehler auf folgendes kleines Beispiel eingeschränkt:

// irgendwo im Code

MyClass * m; // oder auch: MyClass * m = NULL;
try {
m->printList();
}
catch (std::exception & e){
cout << "Exception: " << e.what();
}

Meiner Ansicht nach müsste m-> eine Standardexception auslösen, da
versucht wird, NULL zu dereferenzieren.

In Java ja, in C++ nein. In C++ ist das Dereferenzieren eines
Nullpointers nicht erlaubt.

Quote:
Leider komme ich aber nicht in
den catch-Teil hinein, das ganze bricht direkt ab.
Ich kann mir kaum vorstellen, dass ich unter c++ jedes Dereferenzieren
manuell überprüfen muss um ggf. eine Exception zu werfen. Leider habe
ich nur sehr wenig zu den Standardexceptions im Netz gefunden und bin
daher auf Eure Hilfe angewiesen.

Wo liegt mein Denkfehler?

C++ ist nicht Java.
Ansonsten hast du die Dinge ganz richtig verstanden.

Gruß
Martin

--
http://www.jumli.de
http://www.jumlidev.de/forum/

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Torsten Robitzki
Guest





PostPosted: Mon May 10, 2004 5:06 pm    Post subject: Re: Dereferenzieren von NULL / Standard-Exceptions Reply with quote

F. Bugauer wrote:
Quote:
Hallo

Ich arbeite erst seit Kurzem unter C++ mit Exceptions und versuche nun
schon einige Stunden, einen Codeabschnitt zum Laufen zu bringen.
Offensichtlich habe ich mir aber etwas falsch überlegt: Ich habe
meinen Denkfehler auf folgendes kleines Beispiel eingeschränkt:

// irgendwo im Code

MyClass * m; // oder auch: MyClass * m = NULL;
try {
m->printList();
}
catch (std::exception & e){
cout << "Exception: " << e.what();
}

Meiner Ansicht nach müsste m-> eine Standardexception auslösen, da
versucht wird, NULL zu dereferenzieren. Leider komme ich aber nicht in
den catch-Teil hinein, das ganze bricht direkt ab.

Das ist keine Ausnahme, sondern ein Fehler in Deinem Programm. Das
passiert, wenn Du einen null Zeiger dereferenzierst ist nicht definiert
und sollte damit immer vermieden werden.

Quote:
Ich kann mir kaum vorstellen, dass ich unter c++ jedes Dereferenzieren
manuell überprüfen muss um ggf. eine Exception zu werfen.

Muß man nicht, wenn wenn man weis, das bei einem Fehlerfreien Programm,
ein Zeiger an einer bestimmten Stelle nicht null sein kann. Um zu
dokumentieren, das eine Zeiger an einer bestimmten Stelle nicht null
sein kann, kann man asserts ganz gut verwenden.

Quote:
Leider habe
ich nur sehr wenig zu den Standardexceptions im Netz gefunden und bin
daher auf Eure Hilfe angewiesen.

Wo liegt mein Denkfehler?

Darin, das jeder ein Problem mit Zeigern hat. Entweder ich habe welche,
die auch mal null sein können, dann muß ich das Prüfen und dann ist der
Wert null auch keine Ausnahme oder ich habe Zeiger, die immer auf ein
gültigen Objekt zeigen müssen, dann stellt man das durch entsprechendes
Design sicher und brauch auch nichts zu prüfen.

mfg Torsten

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Daniel Albuschat
Guest





PostPosted: Mon May 10, 2004 5:56 pm    Post subject: Re: Dereferenzieren von NULL / Standard-Exceptions Reply with quote

F. Bugauer wrote:

[snip]

Dazu, dass das Dereferenzieren eines Nullpointers keine
Exception wirft, haben ja meine Vorposter schon was gesagt.

Quote:
// irgendwo im Code

MyClass * m; // oder auch: MyClass * m = NULL;

Hier ist allerdings ein weiterer Denkfehler:
Dem Kommentar entnehme ich, dass du die Statements

Quote:
MyClass *m;

und

Quote:
MyClass *m = NULL;

fuer aequivalent haeltst.

Dies ist allerdings nicht der Fall.
Pointer und eingebaute Typen werden in C++ nicht durch
einen Konstruktor initialisiert. Stattdessen steht in derem
Speicherraum das, was zuvor hineingeschrieben wurde. Und das
kann beliebig sein.

D.h. soetwas koennte u.U. 1000 Mal funktionieren, aber beim
tausendundersten Mal abstuerzen:

Quote:
MyClass *m;
/* ... */
if( m != 0 )
m->methode();

Noch eine Anmerkung zum Stil: In C++ wird eher die Konstante 0
als das Makro NULL verwendet. Darueber scheiden
sich zwar die Geister, aber soweit ich das sehe wird 0 in dieser
Gruppe auch eindeutig bevorzugt.
Grund dafuer ist, dass NULL evtl. als etwas anderes als 0 definiert
sein koennte, und fuer 0 im Pointer-Kontext in C++ besondere Regeln
gelten.

MfG,
Daniel Albuschat

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Martin Kaul
Guest





PostPosted: Wed May 12, 2004 9:34 am    Post subject: Re: Dereferenzieren von NULL / Standard-Exceptions Reply with quote

F. Bugauer wrote:

Quote:
Hallo

Ich arbeite erst seit Kurzem unter C++ mit Exceptions und versuche nun
schon einige Stunden, einen Codeabschnitt zum Laufen zu bringen.
Offensichtlich habe ich mir aber etwas falsch überlegt: Ich habe
meinen Denkfehler auf folgendes kleines Beispiel eingeschränkt:

// irgendwo im Code

MyClass * m; // oder auch: MyClass * m = NULL;
try {
m->printList();
}
catch (std::exception & e){
cout << "Exception: " << e.what();
}

Meiner Ansicht nach müsste m-> eine Standardexception auslösen, da
versucht wird, NULL zu dereferenzieren. Leider komme ich aber nicht in
den catch-Teil hinein, das ganze bricht direkt ab.
Ich kann mir kaum vorstellen, dass ich unter c++ jedes Dereferenzieren
manuell überprüfen muss um ggf. eine Exception zu werfen. Leider habe
ich nur sehr wenig zu den Standardexceptions im Netz gefunden und bin
daher auf Eure Hilfe angewiesen.

Wenn du von C++ dieses Verhalten willst, dann musst du es
implementieren...

In diesem Fall ist der Zeiger dann kein "normaler" Zeiger, sondern
eine Adapterklasse, welche die gewünschte Aufgabe (in deinem Fall
das Werfen der Ausnahme) übernimmt.

einfaches Beispiel:
--------------------
template< typename T >
class save_pointer
{
T *pointer_;
public:
save_pointer( T *pointer=0 )
: pointer_ ( pointer )
{
}
~save_pointer()
{
}
save_pointer( const save_pointer © )
: pointer_ ( copy.pointer_ )
{
}
const save_pointer &operator=( const save_pointer © )
{
pointer_ = copy.pointer_;
return *this;
}
T *operator*()
{
if( !pointer_ )
throw std::runtime_error( "pointer not initialized" );
return pointer_;
}
T *operator->()
{
if( !pointer_ )
throw std::runtime_error( "pointer not initialized" );
return pointer_;
}
operator T *()
{
if( !pointer_ )
throw std::runtime_error( "pointer not initialized" );
return pointer_;
}
};
--------------------

Anwendung:
--------------------
save_pointer< MyClass > m;
m->printList(); // --> wirft Ausnahme
m = new MyClass;
m->printList(); // --> wirft *keine* Ausnahme

delete m;
--------------------


tschaule
Martin

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.