2010-03-25 3 views
22

Jetzt habe ich eine Funktion, die eine Zeichenfolge zurückgeben muss. Ich sah eine bestimmte Implementierung, bei der er ein const char * von der Funktion zurückgibt.Ist es eine gute Idee, "const char *" von einer Funktion zurückzugeben?

Etwas wie folgt aus:

const char * GetSomeString() 
{ 
    ........ 
    return somestlstring.c_str(); 
} 

SomeOtherFoo() 
{ 
    const char * tmp = GetSomeString(); 
    string s = tmp; 
} 

Jetzt fühlte ich da etwas potenziell falsch mit diesem ist. Ist mein Bauchgefühl richtig? oder Ist das ein vollkommen sicherer Code?

Bitte geben Sie mir Ihre Vorschläge. Ich habe das Gefühl Rückkehr const char * auf diese Weise könnte in Chaos führen ..

Danke, Arjun

Antwort

26

Je nachdem, welche somestlstring ist und was dort getan wird.

Wenn es sich um eine lokale Variable handelt, geben Sie einen Zeiger in den Speicher zurück, der freigegeben wird, wenn GetSomeString abgeschlossen ist. Es handelt sich also um einen falschen Zeiger und einen Fehler.

Es läuft alles auf die Lebensdauer von somestlstring und die Operationen, die Sie daran ausführen. Der Zeiger, der von .c_str() zurückgegeben wird, ist garantiert gültig nur bis zur nächsten mutierenden Operation in der Zeichenfolge. Also, wenn sich etwas ändert somestlstring aus dem Anruf an .c_str() und bevor s konstruiert ist, werden Sie in undefiniert Verhalten Land sein.

6

Wenn Sie über die gesamte Lebensdauer des durch die std::stringc_str() Funktion zurück const char * fragen, es ist gültig, bis Sie die Zeichenfolge ändern Sie es aus erhalten wird, oder bis die Zeichenfolge zerstört wird. Es von einer Funktion zurückzugeben ist in Ordnung (obwohl ich sagen würde, keine großartige Übung), vorausgesetzt, Sie tragen diese beiden Tatsachen im Hinterkopf.

2

Es ist nicht großartig - wie lange hält der Speicher für Ihre Schnur? Wer ist dafür verantwortlich, es zu löschen? Muss es überhaupt gelöscht werden?

Sie sollten ein String-Objekt zurückgeben, das für das Zuweisen und Freigeben des Zeichenfolgenspeichers verantwortlich ist - dies könnte ein std :: string sein oder ein QString (wenn Sie Qt verwenden) oder CString (wenn Sie verwende MFC/ATL).

auf eine etwas andere Anmerkung, wird Ihre Schnur jemals unicode sein? Die meisten String-Klassen können transparent mit Unicode-Daten umgehen, aber const char wird nicht ...

1

Es hängt davon ab, wo sich die somestlstring Variable befindet.

Wenn es ein variables Gebietsschema zu der GetSomeString()-Funktion ist, dann ist dies eindeutig falsch. Tatsächlich wird die somestlstring Variable am Ende der Funktion zerstört, und somit zeigt die const char * auf etwas, das nicht mehr existiert.

Wenn es eine globale Variable ist, dann ist dieser Code richtig.

3

Dies ist OK unter den Bedingungen @ Neil ausgearbeitet am. Allerdings ein besserer Weg, einen Verweis auf die Zeichenfolge

string const& GetSomeString() 
{ 
    ........ 
    return somestlstring; 
} 

string s = GetSomeString(); 

Noch unter Berücksichtigung zurückkehren würde, die'somestlstring` keine lokale automatische Variable aber gespeichert woanders in einem Namensraum oder eine Klasse sein muss.Ansonsten können Sie die Zeichenfolge als Wert zurückgeben

string GetSomeString() 
{ 
    ........ 
    return somestlstring; // can be a local automatic variable 
} 

string s = GetSomeString(); 
+2

Es sei denn, somyltstring ist ein lokaler in Funktionsumfang. :-) – Konrad

+2

@Konrad sicher, aber ich sagte auch, dass in meiner Antwort direkt nachdem ich den Code zeigte. :) –

1

einige Szenarien hinzuzufügen, in der diese in Ordnung sein würde:

  • somestlstring ist eine globale Variable in derselben Übersetzungseinheit initialisiert (CPP) als GetSomeString ()
  • somestlstring ist ein nicht statisches Klassenmitglied und GetSomeString ist ein Mitglied dieser Klasse. In diesem Fall muss die Lebensdauer des zurückgegebenen Zeigers dokumentiert werden (im Prinzip - wie andere bereits sagten -, bis sich das Strign ändert oder das Objekt zerstört wird)
  • Sie geben ein Zeichen char const * an eine literale oder kompilierte initialisierte Zeichenfolge
  • zurück
Verwandte Themen