Rückgabe von new()



  • Hallo Leute!

    Liefert new(objekt) eine NULL zurück, wenn kein Speicher mehr zur Verfügung steht oder bei der anforderung des Speichers ein Fehler auftritt?

    Ich hab eine Liste in einer Anwendung. Ein Neues Objekt anzuhängen ist kein Problem. Bei einer gewissen größe zerschießt er die Liste von selbst, macht die alte kaputt legt selbständig eine neue an und verwendet absolut blödsinnige Adressen.
    Ich hab mir die Adressen mal ausgeben lassen, bis zu dem selbständigmachen passen die Vorgänger und nachfolger(doppelt verkettete Liste) danach steht in dem einen, was neu angelegt wird 5858:5858 als Nachfolger, was ja nicht sein kann, weil ich die Werte, wenn es noch keinen Nachfolger gibt, auf NULL setz.

    In anderem Beispiel läuft die Liste gut, also meine ich, das mit dem Speicherallocieren was net passt.

    Danke

    NiP



  • weis nicht genau was new bei fehler macht, denke aber, dass es ne exception wirft



  • new wirft default mäßig std::bad_alloc (aus dem header <new> )
    mit der angabe

    X *y = new (nothrow) X;
    

    sagst du new, dass es im fehlerfalle einen 0 zeiger zurückgeben soll

    alternativ kannst du noch einen neuen new_handler, den new aufruft, wenn es keinen speicher mehr finden kann, über set_new_handler angeben, dieser kann versuchen, irgendwie doch noch speicher zu bekommen.

    [ Dieser Beitrag wurde am 22.04.2003 um 11:38 Uhr von davie editiert. ]



  • Danke erstmal Leute,aber ich hab folgende Zeile mal versucht:

    X *y = new (nothrow) X;
    

    Der will das net fressen. Ich benutz den Borland 5.01, evtl. hat es damit was zu tun? Der will den Code da oben nicht fressen, er meint er kann mit den "nothrow" niox anfangen.

    NiP



  • er meint er kann mit den "nothrow" niox anfangen.

    Hast du den Header <new> inkludiert?



  • Ja hab ich, er meint aber trotzdem

    Undefined Symbol 'nothrow'



  • Hallo,
    wie sieht's mit dem Namespace std; aus? Falls du keine using-direktive/using-deklaration drin hast, heißt das Ding std::nothrow.

    Oder mal anders gefragt: Lässt sich das folgende Minimalprogramm übersetzen?

    #include <new>
    int main()
    {
       int* p = new (std::nothrow) int(42);
    }
    


  • Nee, leider net. Er meldet folgendes: (4 Fehler) alle in der selben Zeile

    Qualifier 'std' is not a class or namespace name

    ) expected

    Type name expected

    Could not find a match for 'operator new(unsigned int,undefined)'

    DAs sind genau die, die ich vorher auch schon zu lesen bekam. Ich hab den Verdacht ich muss da was einstellen in den Optionen des Compilers.

    NiP

    [ Dieser Beitrag wurde am 24.04.2003 um 10:06 Uhr von Nobody_Is_Perfect editiert. ]



  • [quote]
    Qualifier 'std' is not a class or namespace name
    [/quoute]
    ...

    Das würde soviel heißen, als hätte deine Headerdatei noch gar keinen std-Namespace enthalten?

    Sollte sich auch dieses Programm nicht übersetzen lassen, würde ich über die Anschaffung eines neueren Compilers DRINGENDST nachdenken:
    [codet type="c++"]
    #include <iostream>

    int main ()
    {
    std::cout << "Hello World!";

    return ( 0 );
    }
    [/code]

    Sollte sich nur das Programm von Hume Sikkins nicht übersetzen lassen, kann es auch sein, dass die Std-Libary deines Compilers nothrow nicht unterstützt.

    Welchen Compiler verwendest du denn?

    MfG SideWinder



  • Borland 5.01

    ist das nicht der uralt compiler?

    nimm dir doch einen neueren!
    zB einen von http://www.c-plusplus.net/compiler.htm



  • Was bitte mit meinem Posting los?

    MfG SideWinder



  • Hi ich bins wieder!

    Danke für Eure Tips, aber ich bin auf 3 Compiler beschränkt (wegen speziellen Bibliotheken).

    VC 1.52
    BC 5.02
    BC 3.0

    Ich hab jetzt mal den VC 1.52 versucht, aber der blödsinnige Editor cuttet mir die Zeilen nach 251 Buchstaben, kann ich da was einstellen, oder muss ich in einem anderen Editor arbeiten und nur damit Compilieren? Wär ja auch nicht das große Problem.

    NiP



  • VC 1.52? Vergiss es, zu diesen Zeiten kannst du froh sein wenn es <iostream.h> gibt ;). Aber von nothrow hat der sicherlich noch nie etwas gehört.

    MfG SideWinder



  • AFAIK werfen die alten STLs (in denen es auch noch keinen Namespace std gibt) keine exeption wenn new keinen Speicher allokiert, sondern geben einfach NULL zurück....


Anmelden zum Antworten