Assertion failed - set_new_handler



  • Guten Tag,

    es geht um die Fehlerbehandlung für dyn. angeforderten Speicher.

    Mein kleines Neulinx-prg schreibt nach dem Compilieren folgende Zeile auf die Konsole:
    Assertion failed: new_p == 0, file setnewh.cpp, line 52

    QuellText:

    #include <iostream>
    #include <cstdlib>
    #include <new>
    using namespace std;

    char * mystrcat(char * txt1, char * txt2);
    void myerror();

    int main()
    {
    set_new_handler(myerror);
    char txt1[] = "Ich bin ein ";
    char txt2[] ="ein Berliner.";
    char * s;
    s = mystrcat(txt1, txt2);
    cout << "s: " << s << endl;
    delete[] s;
    return 0;
    }

    char * mystrcat(char * txt1, char * txt2)
    {
    int lg1 = strlen(txt1);
    int lg2 = strlen(txt2);
    char * neutext = new char[lg1 + lg2 + 1];

    for (int i = 0; txt1[i] != '\0'; i++)
    neutext[i] = txt1[i];

    for (int j = 0; txt2[j] != '\0'; j++)
    neutext[lg1 + j] = txt2[j];

    neutext[lg1 + lg2] = '\0';
    return neutext;
    }

    void myerror()
    {
    cout << "Fehler." << endl;
    exit(1);
    }

    Leider habe ich nicht die leiseste Ahnung, was ich machen soll.
    Ich bin für jede Anregung sehr dankbar.

    Grüsse Manu



  • Scheint fast so, als würde myerror ein Nullzeiger beim set_new_handler Aufruf sein. Irgendwie seltsam. Probiers trotzdem mal korrekterweise mit

    set_new_handler(&myerror);
    


  • Mal wieder Microsoft spezial. 😃

    set_new_handler() => _set_new_handler()
    Die Signatur der aufgerufenen Funktion muss ebenfalls geändert werden.
    Details siehe MSDN.



  • Hallo und danke für die Anregungen.

    Die Signatur muss _set_new_handler( myError ); sein und die Methode muss einen int-Wert zurückgeben. Funkt aber nur mit <new.h> und nicht mit <new>.

    Bleibt die Frage: Wenn es MS-spezifisch ist, kann man es unter Linux compilieren????

    Grüsse Manu

    #include <iostream>
    #include <cstdlib>
    // Mit <new> gehts NICHT.
    #include <new.h>

    using namespace std;

    char * mystrcat(char * txt1, char * txt2);
    int myError(size_t size);

    int main()
    {
    _set_new_handler( myError );

    cout << "Hallo NEW." << endl;
    char txt1[] = "Ich bin ein ";
    char txt2[] ="ein Berliner.";
    char * s;
    s = mystrcat(txt1, txt2);
    cout << "s: " << s << endl;
    delete[] s;
    return 0;
    }

    char * mystrcat(char * txt1, char * txt2)
    {
    int lg1 = strlen(txt1);
    int lg2 = strlen(txt2);
    //char * neutext = new char[lg1 + lg2 + 1];
    // Unsinnig viel Speicher anfordern.
    char * neutext = new char[20000000000];

    for (int i = 0; txt1[i] != '\0'; i++)
    neutext[i] = txt1[i];
    for (int j = 0; txt2[j] != '\0'; j++)
    neutext[lg1 + j] = txt2[j];
    neutext[lg1 + lg2] = '\0';
    return neutext;
    }

    int myError(size_t size)
    {
    cout << "Fehler bei " << size << " Bytes Speicheranforderung. PRG wird beendet." << endl;
    exit(1);
    }



  • Wahrscheinlich nicht. Da musst du wohl mit bedingter Compilierung arbeiten. :p


Anmelden zum Antworten