2016-03-24 9 views
0

別のスコープで宣言されている動的文字列配列を削除する方法はありますか?たとえば:C++の別のスコープで宣言されている動的文字列配列を削除するにはどうすればよいですか?

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; 
    } 
} 

はまた、それを行うために、またはこれに似た働きの機能を作るために任意のより良い方法はありますか?

+3

より良い質問は、 'string'の配列の配列が必要な理由でしょう。なぜ、あなたは 'vector'を使わないのでしょうか? –

+0

'func'が初期化された後、削除される前に' str'で何をしたいのかを明確にすることはできますか? – jxh

+0

あなたの例では、 'str'は同じスコープで宣言されています – DimChtz

答えて

0

私はそれがやり方ではないと思っています、なぜあなたはそれをしたいのですか? scope1に動的テーブルを作成し、scope1にアクセスできない場所からscope2から配列を削除しようとするのは本当に愚かです。

0

短い答えはノーです。あなたのコードで

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問題のにおい(臭い)ですが、実際にここで達成しようとしていることは明らかではありませんが、何をしたいのかは間違いありません。上記で概説した変更は、コードを構文的に意味のあるものにしますが、コードはソリューションよりもずっと問題です。

+0

私は初心者ですが、ファイルを読み込んでファイルから動的配列に情報を取得する関数を作成しようとしていますので、後でプログラムで使用できます。私はこれを関数にしたかったので、呼び出すだけで何度も使うことができました。 – Memust

+0

@Memust:これは、実際には単一の関数が行うべきことの範囲を超えています(ただし、いくつかのメンバ関数を持つクラスになる可能性があります)。私は 'std :: vector'を探して、次の年または2年間は' new'について忘れることをお勧めします。 –

+0

ありがとう:P – Memust

関連する問題