if(b!=0)
MeinObject *aufDemHeap = new MeinObject("abc");
try
{
x=a/b;
if(x==std::numeric_limits<float>::infitive
|| x==-std::numeric_limits<float>::infitive)
throw new Exception("Fehler beim dividieren");
std::cout << x;
delete aufDemHeap;
}
catch(Exception e)
{
std::cout << e;
delete aufDemHeap;
}|
|
| 1 |
und wenn aufDemHeap nicht nur im Fehlerfall, sondern immer gelöscht werden soll, dann sollte es raus dem catch-Block
– VfBernd 31.08.2009
|
|
|
Natürlich, dass hatte übersehen, danke für die Ergänzung. Jetzt, ausgeschlafen, muss ich auch eingestehen, dass mein Codebeispiel etwas Suboptimal ist, ich häng nochmal ein 2. an.
– Shelling 31.08.2009
|
||
|
Viel erschreckender find ich allerdings auch noch, dass selbst wenn der Fehler geworfen wird, das Ergebnis ausgegeben wird. Den Fehler hab ich auch noch eben berichtigt. Dann sollte der Code soweit sauber sein, oder fällt euch noch was auf?
– Shelling 31.08.2009
|
boost::shared_ptr<MeinObject> aufDemHeap(new MeinObject("abc"));
int x = a / b;
aufDemHeap->TueIrgendwas();|
|
|
Noch einfacher ist es einfach den von C++ in der STL bereitgestellten auto_ptr<> zu verwenden:
{ std::auto_ptr<MeinObject> aufDemHeap(new MeinObject("abc")); ... ... } // hier wird der Destruktor von auto_ptr<> aufgerufen // falls eine Exception auftritt werden die Objekte auf dem Stack ebenfalls ordentlich abgebaut – Frank 07.09.2009
|
||
|
Ah, boost::shared_ptr und std::auto_ptr kannte ich bisher noch gar nicht. Vielen Dank dafür, so ist die Lösung natürlich weit besser.
– Shelling 08.09.2009
|
#include <memory>
...
std::auto_ptr<MeinObject> aufDemHeap(new MeinObject("blub"));
int x = a / b;
aufDemHeap->machWas();
|
|
|
|