2017-06-07 15 views
-1

を満たすためには、私のコーディングです:私はベクトル<int *>に要素を追加するとき、私はここにいくつかの問題

std::vector<int *>a; 
for(i=0;i<3;i++) 
{ 
    int j=i+1; 
    int *p=&j; 
    a.push_back(p); 
} 
for(auto &c:a) 
{ 
    std::cout<<*c<<std::endl; 
} 

私は出力が1,2,3ことにしたいが、出力が3,3,3であります私は同じポインターをaに追加したようですが、循環に別のポインターを追加したいのですが、私は何をすればいいのですか?

+2

第1回目のforループのボディに 'j'がスコープされています。ループが残されるとすぐにアドレスは無効になります。 –

+1

ループが終了するとすぐにpが範囲外になると思うので、UBのように見えます。 – Carcigenicate

+0

ポインタを使用しないでください。ちょうど整数を使用してください。 –

答えて

3

j自動ストレージ期間を有し、そしてそれへのポインタは、forループの特定反復においてのみ有効です。

つまり、というダングリングポインタのベクトルを作成しました。このようなポインタを逆参照する動作は、未定義です。

代わりにstd::vector<int>とします。

(あなたは出力で繰り返し同じ値を参照するという事実は、おそらくにより同じメモリ位置にjを再作成するC++ランタイムにである。しかし、はそれに依存しないでください。C++標準が主張していません

1
std::vector<int *>a; 
for(i=0;i<3;i++) 
{ 
    int j=i+1; 
    int *p=&j; 
    a.push_back(p); 
} 

pはスタック内のアドレスです。さらに、jpは、ループの各反復でのみ有効です。ループが次の反復に進むか、終了すると、もはや有意ではありません(jは破棄されます)。

実際にポインタのベクトルが必要な場合は、ポインタを有効にする必要があります。 1つのオプションは、ポインタがヒープ内のオブジェクトを指し示すことです。もう1つの選択肢は、ポインタが、スコープから外れることのない、すなわち決して破壊されないスタック内のオブジェクトを指すことである。

もう1つ、おそらくより良いオプションは、オブジェクト自体のベクトルを持つことです。 vector<int>

+0

、ありがとう、私は循環によってベクトルに異なるポインタを追加する方法の例を教えてください。 – Kaiser

+0

@ Kaiser Oneは 'int * p = new int {i};を実行できます。 a.push_back(p); 'このようにして、破壊される前に' vector a'のすべてのメンバーに対して 'delete'を呼び出さなければなりません。そうでなければメモリが漏れます。 – Arun

関連する問題

 関連する問題