2017-01-04 10 views
-1

ベクトルintのベクトルを作成しようとしましたが、後で動的に割り当てられたベクトルを解放する方法を混乱させました。どのように動的に割り当てられたベクトルを解放するのですか?

次は私のコードです:

vector<int> *j; 
vector< vector<int> > i; //vector of vector<int> 

int c; //offset of the number 
cin.ignore(); 
for(int count = 0; count < cas; count++) 
{ 
    c = 0; 
    char line[1000]; 
    j = new vector<int>; 
    cin.getline(line, 1000); 
    //tokenize the input string which separate by space “ ” 
    char *p = strtok(line, " "); 
    while(p != NULL) 
    { 
     n[c] = string(p); 
     c++; 
     p = strtok(NULL, " "); 
    } 

    //convert the string input to integer for further calculation 
    for(int m = 0; m < c; m++) 
    { 
     (*j).push_back(atoi(n[m].c_str())); 
    } 
    i.push_back(*j); 
} 

//this is the way i try to free the allocated vector, and i get segmentation fault for this 
    j = &i[0]; 
    delete [] j; 
+5

なぜ最初に動的に割り当てる必要がありますか?理由はありません。 – Slava

+0

'ベクトル< vector>'はベクトルではないベクトルポインタのリストを保持し、 'std :: vector'はそのオブジェクトのメモリをそれにプッシュします。 –

+0

最初に 'new'を使用しない方が良いでしょう。 'j'を'ベクトル j; 'に変更し、ループ本文を' j.push_back(10);に変更します。 i.push_back(std :: move(j)); '。 –

答えて

3

あなたが任意のポインタまたはnewまたはdeleteを必要としません。これらは、この単純なプログラムにはない高度な概念です。

vector<vector<int>> i; 

for (...) { 
    vector<int> j; 
    // fill up j 
    i.push_back(j); 
} 

ベクトルのベクトルは、概念的にはintのベクトルとは異なります。 vector<int>を入力する必要があるときには、新しいものを削除したり、intを削除したりしないでください。 vector<X>を使用している場合は、Xには対応する必要もありません。

+1

上記のプログラムは、 'j'または' push_back'を使わないように書き直すことができます。方法を見つけることができますか? –

+0

oh isee ...ベクトルのベクトルなので、私は単に[offset] .push_back(number)のようにすることができます。しかし、私はまだ最初のiのサイズを指定する必要があります(例えばベクトル< vector> i(100))でしょうか?ありがとうございました。私はこれまで考えていませんでした。 @ n.m。 – FoulQua

+0

ループの先頭にある外側のベクトルに対して 'resize'を呼び出すことができます。 'i.resize(i.size()+ 1);'そうすれば、 'i.back()を使うことができます。push_back(number) '(backは最後の要素への参照を返します)。 –

1

i.push_back(*j); 

does'tは、ポインタを押します。ベクトルのコピーを作成します。

とすぐにあなたがそこに、その後

delete j; 

できる、ということをやったと。

(あなたがポインタを保存するためにiを変更する場合はもちろん、話は全く異なるものになります。)

+0

は、i.push_back(* j)の後にjを削除するため、コピーを作成してベクターへの参照をプッシュするようには見えません。 forループの後、私はi [0] [0]で競合にアクセスしようとしましたが、セグメンテーションフォルトが発生します。これを少し説明できますか?ありがとう。 @NPE – FoulQua

+0

@FoulQua:コードに表示されていない、または私たちに説明したことが間違っています。 –

+0

@BenjaminLindley ok、私は今のコードを更新しました。 – FoulQua

関連する問題