Programmieren - alles kontrollieren 4.940 Themen, 20.676 Beiträge

Linux/gcc 3.2.3/C++: new mit nothrow. Wie?

d-oli / 5 Antworten / Baumansicht Nickles

Hi


 


Ich habe da ein Programm das von UNIX auf Linux portiert wurde. In diesem Programm hat es unter anderem ein Error-Fenster das erzeugt wird wenn ein Speicherfehler vorliegt. Das Ganze sieht ungefähr so aus:


 


class guiErrorMsg : public …


{


public:


&nbsp&nbsp&nbsp guiErrorMsg ( widget TheParent, char* TheMessage, TheTitle );


&nbsp&nbsp&nbsp // etc.


 


private:


&nbsp&nbsp&nbsp // etc.

 


};


 


in main()


{


&nbsp&nbsp&nbsp // etc.


&nbsp&nbsp&nbsp if( new guiErrorMsg( …, …, … ) == NULL )


&nbsp&nbsp&nbsp {


&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp throw( … );


&nbsp&nbsp&nbsp }


&nbsp&nbsp&nbsp // etc.


&nbsp&nbsp&nbsp return 0;


}


 


Ich möchte nun aber, dass kein throw() sondern ein Eintrag in einem Logger ausgeführt wird. Nun habe ich folgendes in einem Fachbuch gelesen:


 


According to the C++ standard, if new runs put of memory, it throws an exception that normally aborts the program. On older C++ systems, when new runs out of memory, it returns a null pointer.


 


Und folgendes habe ich mit $man g++ herausgefunden:


 


<b>-fcheck-new</b>


&nbsp&nbsp&nbsp Check that the pointer returned by "operator new" is non-null


&nbsp&nbsp&nbsp before attempting to modify the storage allocated. The current


&nbsp&nbsp&nbsp Working Paper requires that "operator new" never return a null


&nbsp&nbsp&nbsp pointer, so this check is normally unnecessary.


 


&nbsp&nbsp&nbsp An alternative to using this option is to specify that your "opera-


&nbsp&nbsp&nbsp tor new" does not throw any exceptions; if you declare it tthhrrooww(()),


&nbsp&nbsp&nbsp G++ will check the return value.  See also new (nothrow).


 


Also nehme ich an, dass in meinem Fall ein throw() ausgeführt und nicht ein Null-Pointer zurückgegeben wird.


Aber gerade throw() will ich unterdrücken. Ich kann leider nirgends ein Manual oder ein Beispiel finden (auch mit google nicht) das „See also new (nothrow)“ näher beschreiben würde.


 


Wer kann mir weiterhelfen?


 


Dank und Gruss,


d-oli


 


 
Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
d-oli Nachtrag zu: „Linux/gcc 3.2.3/C++: new mit nothrow. Wie?“
Optionen




Hi

Ich habe da ein Programm das von UNIX auf Linux portiert wurde. In diesem Programm hat es unter anderem ein Error-Fenster das erzeugt wird wenn ein Speicherfehler vorliegt. Das Ganze sieht ungefähr so aus:

class guiErrorMsg : public ?
{
public:
    guiErrorMsg ( widget TheParent, char* TheMessage,  char* TheTitle );
    // etc.
private:
    // etc.
};

in main()
{
    // etc.

    if( new guiErrorMsg( ?, ?, ? ) == NULL )
    {
       throw( ? );
    }

    // etc.
    return 0;
}

Ich möchte nun aber, dass kein throw() sondern ein Eintrag in einem Logger ausgeführt wird. Nun habe ich folgendes in einem Fachbuch gelesen:

According to the C++ standard, if new runs put of memory, it throws an exception that normally aborts the program. On older C++ systems, when new runs out of memory, it returns a null pointer.

Und folgendes habe ich mit $man g++ herausgefunden:

-fcheck-new
    Check that the pointer returned by "operator new" is non-null
    before attempting to modify the storage allocated. The current
    Working Paper requires that "operator new" never return a null
    pointer, so this check is normally unnecessary.

    An alternative to using this option is to specify that your "opera-
    tor new" does not throw any exceptions; if you declare it tthhrrooww(()),
    G++ will check the return value.  See also new (nothrow).

Also nehme ich an, dass in meinem Fall ein throw() ausgeführt und nicht ein Null-Pointer zurückgegeben wird.

Aber gerade throw() will ich unterdrücken. Ich kann leider nirgends ein Manual oder ein Beispiel finden (auch mit google nicht) das ?See also new (nothrow)? näher beschreiben würde.


Wer kann mir weiterhelfen?

Dank und Gruss,
d-oli


Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
marco72 d-oli „Sorry. Noch ein mal.“
Optionen

vb

bei Antwort benachrichtigen
Enrico_Horn d-oli „Linux/gcc 3.2.3/C++: new mit nothrow. Wie?“
Optionen

Warum machst du das new() nicht einfach innerhalb eines try()...catch()-Statments?

bei Antwort benachrichtigen
d-oli Enrico_Horn „Warum machst du das new nicht einfach innerhalb eines try ...catch -Statments?“
Optionen

Hi

Danke für die Antwort.

An try{}...catch{} habe ich auch schon gedacht. Bei einem Allokationsfehler wirft new sogar die bad_alloc Meldung.
Aber was macht das Ganze für einen Sinn, wenn kein freier Speicher mehr vorhanden ist?

Ich denke das ich einfach ein new ohne weitere Prüfung machen werde. Sollte es zu diesem Zeitpunkt keinen freien (RAM/Swap) Speicher mehr haben ist sowieso Schluss.

Dank und Gruss
d-oli

Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
westberlin1 d-oli „Linux/gcc 3.2.3/C++: new mit nothrow. Wie?“
Optionen

TEST

bei Antwort benachrichtigen