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.
Eine bessere Frage wäre, warum Sie ein Array von Arrays von 'string' benötigen. Oder warum Sie nicht 'vector's verwenden. –
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
In Ihrem Beispiel wurde 'str' im selben Bereich deklariert. – DimChtz