2016-10-31 13 views
0

私はダイナミックな配列で私の最初の本当のプログラムを書こうとしていますが、私は理解できない問題に遭遇しました。基本的には、私は動的配列を取って一時的な配列にコピーし、元の配列にもう1つのアドレスを追加して元の配列にすべてコピーし直そうとしています。元の配列には以前より1つ多くのアドレスがあります。これはintで試してみるときちんと動作しましたが、文字列がプログラムをクラッシュさせます。ここで私が苦しんでいるコードの例です:新しい文字列を割り当てるとクラッシュしますか?

void main() 
{ 
int x = 3; 
std::string *q; 
q = new std::string[x]; 

q[0] = "1"; 
q[1] = "2"; 
q[2] = "3"; 

    x++; 
    std::string *temp = q; 
    q = new std::string[x]; 
    q = temp; 
    q[x-1] = "4"; 

    for (int i = 0; i < 5; i++) 
    std::cout << q[i] << std::endl; 
} 

私は文字列の代わりにint型へのポインタにQと一時を作るとしたら、プログラムがうまく動作します。どんな助けでも大いに感謝されるでしょう、私はこれに1時間か2時間執着しています。

+0

'q =新しいstd :: string [x];と' q = temp; '...' = '記号はどちらの場合も同じことを意味します –

答えて

1

q = tempは、シャローコピーのみを実行します。オリジナルのqと、それが指していたすべての文字列が失われます。

もしxの要素は、現在配列の範囲外にある4つの要素を有することqを再割り当て、その後直ちにアクセス(および割り当て)、(唯一の3つの要素が割り当てられた)tempを再割り当てするので。

あなたには、いくつかの理由で、このようにそれを行う必要がある場合、それは次のようになります。

auto temp = q; 
q = new std::string[x]; 

for(int x = 0; x < 3; ++x) 
    q[x] = temp[x]; 

delete [] temp; 
q[x] = 4; 

しかし、これは明らかに、より複雑で、非常に多くなりやすいエラーにこれを行うための慣用的な方法よりもC++で。代わりにstd::vector<std::string>を使用する方がよいでしょう。

+0

これを試してみましょう。ありがとう –

関連する問題