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 52QuellText:
#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