• 締切済み

vectorに格納されたオブジェクトの廃棄

次のようなテストプログラムを作ってみました。 OSはVineです。 #include <iostream> #include <string> #include <vector> using namespace std; class Neko{ string name; public: Neko(){} Neko(string n):name(n){} void SetName(string n){name=n;} void Naku() const; }; void Neko::Naku() const{ cout << "名前は" << name << endl; } int main(){ int i; int num; string temp; vector <Neko> x; for(i=0;i<num;i++){ Neko *y=new Neko; x.push_back(*y); } for(i=0;i<num;i++){ cout << "名前を入力" << endl; cin >> temp; x[i].SetName(temp); } for(i=0;i<num;i++)x[i].Naku(); delete [] x;・・・※ } 廃棄(※のところ)するとき、これでは コンパイルエラーになってしまいます。 for文で回しても同じです。 どのように書けばよいのでしょうか? vectorにはポインタではなくオブジェクトが 入っていることに注意してください。

みんなの回答

回答No.8

> Neko *y=new Neko; > x.push_back(*y); x.push_bach(Neko()); とやれば、deleteなんかしなくていい(してはならない)のですけど。

noname#108554
質問者

お礼

No.7さんへのお礼と同じ状況です。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.7

>これだとせっかく作ったのに >すぐに消さなきゃいけないじゃないですか? いいんですよ、ここで消しても。 >入っているのはvector::push_back内部で作成されたオブジェクトでは? ということなんですから。 #1で書いたソース、試していただけました? newしたオブジェクトがvectorが破棄されるまでずっと必要なんてことでしたら、 x[0].Naku(); x[1].Naku(); x[2].Naku(); の出力結果、みんな同じになっちゃいますよね。 理解していただけました?

noname#108554
質問者

お礼

やっぱりできません。 コンパイルは通りますが、メッセージは何も出てきません。 念のため、今、実行したプログラムを載せておきます。 #include <iostream> #include <string> #include <vector> using namespace std; class Neko{ string name; public: Neko(){} Neko(string n):name(n){} void SetName(string n){name=n;} void Naku() const; }; void Neko::Naku() const{ cout << "名前は" << name << endl; } int main(){ int i; int num; string temp; Neko n; vector <Neko> x; for(i=0;i<num;i++){ Neko *y=new Neko; x.push_back(*y); delete y; } n.SetName("0"); x.push_back(n); n.SetName("1"); x.push_back(n); n.SetName("2"); x.push_back(n); x[0].Naku(); x[1].Naku(); x[2].Naku(); }

  • 8oo
  • ベストアンサー率0% (0/1)
回答No.6

>不定じゃないですよ。 失礼。 メンバ変数はstd:stringだけでしたね。 よく見てませんでした。

  • 8oo
  • ベストアンサー率0% (0/1)
回答No.5

>不定じゃないですよ。 でしたら、どんな値かおしえてください。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>これは値が不定なNeko型変数をvectorにpushしています。 不定じゃないですよ。 newでインスタンス作成してます。当然このタイミングで デフォルトコンストラクタ呼ばれますし。 >なぜって・・・ためしにdeleteしないでやってみたんですが >コンパイルはとおりますが、PCが固まってしまいます。 numのせいでしょう、おそらく。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>結局、deleteはどうなるんでしょう? for(i=0;i<num;i++){ Neko *y=new Neko; x.push_back(*y); delete y; //ここ }

noname#108554
質問者

お礼

これだとせっかく作ったのに すぐに消さなきゃいけないじゃないですか?

  • 8oo
  • ベストアンサー率0% (0/1)
回答No.2

答えではありません。 まずnumの値が不定です。 mallocやnewして確保したポインタは確保した人が管理しなければい けけない事をご存知でしょうか? (free , delete しなければいけません。) x.push_back(*y); >vectorにはポインタではなくオブジェクトが >入っていることに注意してください。 これは値が不定なNeko型変数をvectorにpushしています。 確保したアドレスはどこに保存しているのでしょうか? これではdeleteするアドレスを失ってしまっています。 delete [] x; xは確保したアドレスが入っていますか? xはスタックフレーム上のvectorコンテナです。 なぜdeleteするのでしょうか? delete[]は確保した配列を開放します。 xは配列でしょうか?

noname#108554
質問者

お礼

ありがとうございます。 >確保したアドレスはどこに保存しているのでしょうか? >これではdeleteするアドレスを失ってしまっています。 結論として、vectorにオブジェクトを格納するのは不可能ということですか? >なぜdeleteするのでしょうか? なぜって・・・ためしにdeleteしないでやってみたんですが コンパイルはとおりますが、PCが固まってしまいます。 >xは配列でしょうか? いえ、vectorです。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>vectorにはポインタではなくオブジェクトが >入っていることに注意してください。 入っているのはvector::push_back内部で作成されたオブジェクトでは? ということで、本当に必要なdeleteは delete y; かと。 で、もちろんループの中に書かないといけないんで、 思いっきりリークしてますね。 Neko n; vector <Neko> x; n.SetName("0"); x.push_back(n); n.SetName("1"); x.push_back(n); n.SetName("2"); x.push_back(n); x[0].Naku(); x[1].Naku(); x[2].Naku(); でしたらわかっていただけます?

noname#108554
質問者

お礼

ありがとうございます。 結局、deleteはどうなるんでしょう? Neko n; vector <Neko> x; などを書き直し、 delete y; delete x; delete [] x; としてみましたが、やはりコンパイルエラーです。

関連するQ&A