短い答えはノーです。あなたのコードで
:
void func(int a){
if(a==0){
string ** str = new string * [1];
str
はそれだけで、この範囲内に存在するので、このスコープで定義されている - つまり、str
は実行がスコープに入ったときに作成され、破壊された実行はスコープを終了。
str
の名前はそのスコープにも制限されているので、そのスコープの外側では名前は意味を持ちません(スコープ内にある同じ名前の宣言がない限り)。
あなたの質問とは無関係
str[0] = new string [2];
str[1] = new string [2];
が、これは未定義の動作をしていることに注意してください。上記のように、正確にのブロックを割り当て、のポインタを文字列に割り当て、そのアドレスをstr
に格納しました。ここでは2つの文字列へのポインタを使用しようとしています。あなたは割り当てられたメモリの終わりを越えて書き込みを行い、未定義の動作を与えます。
str
(それ自身)が破壊された場合、そのメモリにアクセスできなくなります(ただし、そのメモリは削除されないため、今のところa == 0
と呼ぶと必然的にメモリリーク
}
if(a==1){
delete [] str[1];
delete [] str[0];
delete [] str;
あなたの質問に戻って行き方:。。いいえstr
は、それが、ここでは意味を持たないことを意味し、上記の範囲に定義されている
あなたが両足でstr
を操作したい場合。 if
ステートメント、それを定義することができますif
声明:
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;
}
}
あなたは明らかに破壊するために別の値を再び文字列を作成するために、一つの値で一度関数を呼び出して、したいので、それは(関数の呼び出しの間で保存されていますので、私はstr
静的を作りましたそれら。
これはまだXY問題のにおい(臭い)ですが、実際にここで達成しようとしていることは明らかではありませんが、何をしたいのかは間違いありません。上記で概説した変更は、コードを構文的に意味のあるものにしますが、コードはソリューションよりもずっと問題です。
より良い質問は、 'string'の配列の配列が必要な理由でしょう。なぜ、あなたは 'vector'を使わないのでしょうか? –
'func'が初期化された後、削除される前に' str'で何をしたいのかを明確にすることはできますか? – jxh
あなたの例では、 'str'は同じスコープで宣言されています – DimChtz