2016-03-24 6 views
0

Gibt es eine Möglichkeit, ein dynamisches Zeichenfolgenarray zu löschen, das in einem anderen Bereich deklariert wurde? Zum Beispiel:Wie kann ich ein dynamisches Zeichenfolgenarray löschen, das in C++ in einem anderen Bereich deklariert wurde?

void func(int a){ 
    if(a==0){ 
     string ** str = new string * [1]; 
     str[0] = new string [2]; 
     str[1] = new string [2]; 
    } 
    if(a==1){ 
     delete [] str[1]; 
     delete [] str[0]; 
     delete [] str; 
    } 
} 

Außerdem gibt es einen besseren Weg, es zu tun, oder eine Funktion zu machen, die in etwa so funktioniert?

+3

Eine bessere Frage wäre, warum Sie ein Array von Arrays von 'string' benötigen. Oder warum Sie nicht 'vector's verwenden. –

+0

Können Sie versuchen zu erklären, was Sie 'func' mit' str' machen wollen, nachdem es initialisiert wurde, aber bevor es gelöscht wird? – jxh

+0

In Ihrem Beispiel wurde 'str' im selben Bereich deklariert. – DimChtz

Antwort

0

Ich glaube nicht, dass dies eine Möglichkeit ist, die Frage ist, warum Sie es tun wollen. Es ist wirklich albern, eine dynamische Tabelle in einem scope1 zu erstellen und dann zu versuchen, ein Array aus scope2 zu löschen, von dem Sie keinen Zugriff auf scope1 haben.

0

Die kurze Antwort ist nein.

In Ihrem Code:

void func(int a){ 
    if(a==0){ 
     string ** str = new string * [1]; 

str ist in diesem Bereich definiert, so dass es nur in diesem Bereich vorhanden ist - das heißt, str erstellt wird, wenn die Ausführung den Umfang eintritt, und zerstört, wenn die Ausführung des Umfangs verlässt .

Der Name str ist ebenfalls auf diesen Bereich beschränkt, daher hat der Name außerhalb dieses Bereichs keine Bedeutung (es sei denn, es gibt natürlich eine andere gleichnamige Deklaration, die zufällig im Umfang ist).

Nicht relevant für Ihre Frage, aber beachten Sie, dass dies undefiniert Verhalten hat Oben haben Sie einen Block von genau einen Zeiger auf Zeichenfolge zugewiesen und seine Adresse in str gespeichert. Hier versuchen Sie, zwei Zeiger auf Zeichenfolge zu verwenden. Sie schreiben über das Ende des zugewiesenen Speichers hinaus und geben ein undefiniertes Verhalten.

Beachten Sie auch, wenn str (selbst) zerstört wird, verlieren Sie den Zugriff auf den Speicher, auf den es zeigt (aber dieser Speicher wird nicht gelöscht, so wie es jetzt steht, ruft dies mit a == 0 unweigerlich zu ein Speicherleck

} 
    if(a==1){ 
     delete [] str[1]; 
     delete [] str[0]; 
     delete [] str; 

zurück auf Ihre Frage bekommen:.. kein str ist oben in den Rahmen definiert, was bedeutet, dass es hier keine Bedeutung hat

Wenn Sie str in beiden Beinen des manipulieren wollen. if Aussage, können Sie es außerhalb dieserdefinierenAussage:

void func(int a){ 
    static string ** str; 

    if(a==0){ 
     str = new string * [2]; 
     str[0] = new string [2]; 
     str[1] = new string [2]; 
    } 
    if(a==1){ 
     delete [] str[1]; 
     delete [] str[0]; 
     delete [] str; 
    } 
} 

ich str statisch gemacht haben, so dass es zwischen den Aufrufen der Funktion erhalten ist (da Sie wollen offenbar mit einem Wert, der die Funktion einmal aufrufen, um die Saiten zu erstellen, und wieder mit einem anderen Wert zu zerstören Sie.

Das riecht (stinkt) immer noch nach dem XY-Problem - es ist nicht klar, was Sie hier wirklich erreichen wollen, aber was immer Sie tun wollen, das ist mit ziemlicher Sicherheit der falsche Weg. Die Änderung, die ich oben skizziert habe, macht den Code syntaktisch sinnvoll, aber der Code ist immer noch viel mehr ein Problem als eine Lösung.

+0

Nun, ich bin ein Anfänger und ich versuche, eine Funktion zu machen, die eine Datei lesen und Informationen aus der Datei an das dynamische Array abrufen würde, damit ich es später im Programm verwenden kann. Ich wollte, dass dies eine Funktion ist, damit ich sie mehrmals verwenden kann, indem ich sie einfach anrufe. – Memust

+0

@Memust: Dies ist wirklich nicht der Rahmen dessen, was eine einzelne Funktion tun sollte (aber es könnte eine Klasse mit ein paar Member-Funktionen sein). Ich würde empfehlen, 'std :: vector' nachzuschlagen und für das nächste Jahr oder zwei" neue "zu vergessen. –

+0

Okay. Danke P – Memust

Verwandte Themen