Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » SegFault bei delete

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 <
000
13.09.2009, 21:51 Uhr
FunnyDingo



Hallo zusammen,

ich bin mal wieder richtig aktiv . Folgender Code sei gegeben:

C++:
cHTTPRequest *tmp;
try {
  tmp = new cHTTPRequest(ListenSocket);
  handleRequest(tmp);
}
catch(exNetwork &e)
{
  if (tmp != NULL)
    delete tmp;
}
catch(exParsing &e)
{
  if (tmp != NULL)
    delete tmp;
}

Wenn nun im Constructor von cHTTPRequest eine Exception ausgelöst wird, stirb mein Programm mit einem SegFault. Ich verstehe nur nicht warum. Eigentlich müsste der Pointer doch noch NULL sein und somit dürfte delete gar nicht erreicht werden, oder?
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.09.2009, 22:34 Uhr
0xdeadbeef
Gott
(Operator)



C++:
cHTTPRequest *tmp = 0;


...Initialisierung nicht vergessen. Und das Löschen kannst du dir sparen, die Instanz wird dem Zeiger ja nie zugewiesen. Wenn der Konstruktor eine Ausnahme schmeißt, gibt new den Speicher wieder frei, den es angefordert hat. Du musst aber natürlich trotzdem darauf achten, dass der Konstruktor nicht leckt.

Oh, und

C++:
delete NULL;


ist harmlos, du könntest dir die Überprüfung also sparen, selbst wenn die Freigabe notwendig wäre.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 13.09.2009 um 22:37 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.09.2009, 15:50 Uhr
FunnyDingo




Zitat von 0xdeadbeef:

C++:
cHTTPRequest *tmp = 0;


...Initialisierung nicht vergessen. Und das Löschen kannst du dir sparen, die Instanz wird dem Zeiger ja nie zugewiesen.

OK, das sehe ich ein. Da handleRequest aber einen exParsing werfen kann und tmp bereits auf das Objekt zeigt, muss dort auf jeden Fall ein delete (und vorher natürlich noch ein schönes Error Handling) erfolgen.


Zitat von 0xdeadbeef:
Oh, und

C++:
delete NULL;


ist harmlos, du könntest dir die Überprüfung also sparen, selbst wenn die Freigabe notwendig wäre.

Das wusste ich nicht, aber gut zu wissen, da kann ich ja an einigen Stellen bissle Code raus werfen

Also sollte ich vll zur Sicherheit nach jedem delete noch fix 0 zuweisen oder passiert das sogar automatisch?
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.09.2009, 20:24 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von FunnyDingo:

Also sollte ich vll zur Sicherheit nach jedem delete noch fix 0 zuweisen oder passiert das sogar automatisch?

das passiert nicht automatisch
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.09.2009, 02:06 Uhr
0xdeadbeef
Gott
(Operator)



C++:
template<typename t> void safe_delete(t *&p) {
  delete p;
  p = 0;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: