2010-04-05 9 views
20

diesen Code vor:Lebensdauer eines Zeichenfolgenliterals von einer Funktion zurück

const char* someFun() { 
    // ... some stuff 
    return "Some text!!" 
} 

int main() 
{ 
    { // Block: A 
     const char* retStr = someFun(); 
     // use retStr 
    } 
} 

In der Funktion someFun(), wo ist "Some text!!" gespeichert (ich denke, es ist in einem gewissen statischen Bereich von ROM sein kann) und was ist sie Umfang Lebensdauer?

Wird der durch retStr angezeigte Speicher während des gesamten Programms belegt oder freigegeben, sobald der Block A beendet wird?

+0

Sie auch einen Blick auf diese Frage annehmen: http://stackoverflow.com/questions/267114/scope-of-string-literals – quinmars

Antwort

38

Der C++ Standard sagt nicht, wo Zeichenfolgenliterale gespeichert werden sollten. Es garantiert jedoch, dass ihre Lebensdauer die Lebensdauer des Programms ist. Ihr Code ist daher gültig.

5

Der String wird statisch in einem speziellen Teil des Programmbinärs gespeichert, der normalerweise nur gelesen werden kann. Sein Speicher wird nicht zugewiesen (einzeln für den String, nur für den gesamten Abschnitt, während er in den Speicher geladen wird) und wird nicht freigegeben.

+3

Das ist nicht unbedingt wahr. Was, wenn das binäre Format, zu dem Sie verlinken, den Begriff "schreibgeschützte Abschnitte" nicht unterstützt? (z. B. die meisten grundlegenden COM-Dateien) – conio

+1

mamonts hat auch keine Leseabschnitte. Sie haben nur historisches Interesse. – osgx

+0

sogar in com-Datei wird es einen Teil (Abschnitt der Datei) oder mehrere, um Konstanten zu speichern. Sie werden nicht nur in Segmenten oder in Seitenbeschreibungen als gelesen markiert, sondern die Idee ist dieselbe. – osgx

23

Die "Some text!!" hat keine Scope. Scope ist eine Eigenschaft einer namens Einheit. Genauer gesagt ist es eine Eigenschaft des Namens selbst. "Some text!!" ist ein namenloses Objekt - ein String-Literal. Es hat keinen Namen und daher machen Diskussionen über seinen "Umfang" überhaupt keinen Sinn. Es hat keinen Spielraum.

Was Sie scheinen zu fragen ist nicht Scope. Es ist Lebenszeit oder Lagerdauer von "Some text!!". String-Literale in C/C++ haben statische Speicherdauer, was bedeutet, dass sie "für immer" leben, d. H. Solange das Programm läuft. So wird der von "Some text!!" belegte Speicher niemals freigegeben.

Denken Sie nur daran (als Randnotiz), dass String-Literale nicht modifizierbare Objekte sind. Es ist illegal, in diesen Speicher zu schreiben.

+2

korrigieren Lebensdauer, nicht Bereich, meine schlecht :( – sud03r

-1

Wird der Speicher von retStr während des gesamten Programms belegt oder freigegeben, wenn der Block A beendet wird?

Edit:

Es wird nicht veröffentlicht, aber retStr wird nicht verfügbar sein. (Block Umfang)

const char *ptr; 
{ 
    const char* retStr = "Scope"; 
    ptr = retStr; 
} 

printf("%s\n", ptr); //prints "Scope" 

//printf("%s\n", retStr); //will throw error "retStr undeclared" 
+0

es wird nicht freigegeben nur das Symbol retStr wäre nicht verfügbar – sud03r

+0

Falsch. Der Speicher, auf den retstr zeigt nach der Ausführung ist statischer Speicher. Es ist bei der Anwendung zugeordnet startet und wird nur (effektiv) freigegeben, wenn die Anwendung beendet wird – Alan

+0

@all: mein Fehler, ich dachte über 'retStr' nach. Ändere die Antwort. –

Verwandte Themen