2016-05-31 24 views
0

Ich versuche, eine Zeichenfolge aus einer Funktion wie diese zurück erhalten:einen String zurück, aber Müll

virtual const char* what() const throw() 
{ 
    std::string str = "Name Error: name "; 
    str+= n_name; 
    str += " is not defined"; 
    char ret[256]=""; 
    const char* temp = str.c_str(); 
    strcpy(ret, temp); 
    return ret; 
} 

Aber wenn ich versuche, es an einem anderen Ort zu drucken:

const char* str= exc.what(); 
std::cout << str; 

Der Ausgang ist Müll.

Ich dachte, das Problem war das Zeichen [] und es * char sein sollte, aber wenn ich es

char* ret=""; 
mir verändern

das Programm abgestürzt bei

strcpy(ret, temp); 

Kann jemand bitte helfen? P.S. die Funktion hat einen const char *

+1

Sie geben einen Zeiger auf ungültigen Speicher zurück.Sie müssen etwas Speicher zuweisen, auf den der Zeiger zeigt. Siehe 'malloc' oder 'neu []'. – ZunTzu

Antwort

0

durch das Moment what() zurückkehrt und der Rückgabewert zurückzubringen, in str gespeichert wird das Array ret von worden zerstört wird, weil es Umfang und das der Zeiger von what() zurückgegeben wird, ist ein dangling Zeiger, der bewirkt, dass Undefiniert bevahour nach dem Entfencing. Sie sollten entweder new das Array (und delete es nach der Verwendung) oder einfach eine std::string zurückgeben.

+0

Danke ich habe einen Weg gefunden! – alonpeer12345

0

Das Hauptproblem kommt vom Zurückgeben des Zeigers auf eine lokale Variable. Wenn Sie -Wall Option Compiler verwenden (was ich empfehlen Ihnen, in jeder Kompilierung Sie getan zu verwenden), erhalten Sie:

Warnung: Adresse einer lokalen Variablen 'ret' ergab [-Wreturn-local-Adr]

Tatsächlich ist char ret[256]=""; lokal zu funktionieren. Am Ende der Funktion existieren lokale Variablen nicht mehr. Wenn also std::cout << str; ausgeführt wird, ist der angegebene Speicher nicht mehr vorhanden.

Wenn Sie char* ret=""; verwenden, reservieren Sie keinen Speicher. Sie haben nur einen Zeiger, der auf einen schreibgeschützten statischen Speicher zeigt, der "" enthält. Und immer mit -Wall Option, erhalten Sie eine Warnung erhalten, die sagt, dass Sie etwas falsch machen:

Warnung: ISO C++ verbietet eine String-Konstante zu 'char *' Umwandlung [-Wwrite-strings]

Sie haben Speicher zuweisen:

char * ret = new char[str.size()+1]; 

Aber kümmern, jede new irgendwo ein delete => sollte jeder manuell zugewiesenen Speicher manuell 012 haben müssen

freigegeben werden
+0

Sind Sie sicher char [256] = "" reserviert Speicher? Wie unterscheidet es sich von char * ret = "", was auf schreibgeschützten statischen Speicher verweist? – ZunTzu

+0

'char ret [256] =" "' automatisch Speicher auf Stapel für 256 'char' zuweisen und es zu' "" 'initialisieren. Die Freigabe erfolgt automatisch am Ende der Funktion – Garf365

+0

Vielen Dank! Es funktioniert jetzt! – alonpeer12345

0

Es sieht so aus, als ob Sie versuchen, eine Ausnahme zu implementieren. Warum erben Sie nicht einfach von std::runtime_error, die bereits die Maschinerie zur Verfügung stellt, um diese Arbeit zu machen? Sie müssen nur die gewünschte Nachricht an den Konstruktor übergeben.

Siehe http://en.cppreference.com/w/cpp/error/runtime_error

+0

Das ist der Teil der Aufgabe, Ausnahmen zu erstellen. Trotzdem danke – alonpeer12345

+0

Sie könnten bessere Antworten bekommen, wenn Sie nach Ihrem wirklichen Problem gefragt haben. Aber ich denke, dass Sie das nützlich finden könnten: http://stackoverflow.com/a/134612/212870 –