- 締切済み
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にはポインタではなくオブジェクトが 入っていることに注意してください。
- みんなの回答 (8)
- 専門家の回答
みんなの回答
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> Neko *y=new Neko; > x.push_back(*y); x.push_bach(Neko()); とやれば、deleteなんかしなくていい(してはならない)のですけど。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>これだとせっかく作ったのに >すぐに消さなきゃいけないじゃないですか? いいんですよ、ここで消しても。 >入っているのはvector::push_back内部で作成されたオブジェクトでは? ということなんですから。 #1で書いたソース、試していただけました? newしたオブジェクトがvectorが破棄されるまでずっと必要なんてことでしたら、 x[0].Naku(); x[1].Naku(); x[2].Naku(); の出力結果、みんな同じになっちゃいますよね。 理解していただけました?
お礼
やっぱりできません。 コンパイルは通りますが、メッセージは何も出てきません。 念のため、今、実行したプログラムを載せておきます。 #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)
>不定じゃないですよ。 失礼。 メンバ変数はstd:stringだけでしたね。 よく見てませんでした。
- 8oo
- ベストアンサー率0% (0/1)
>不定じゃないですよ。 でしたら、どんな値かおしえてください。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>これは値が不定なNeko型変数をvectorにpushしています。 不定じゃないですよ。 newでインスタンス作成してます。当然このタイミングで デフォルトコンストラクタ呼ばれますし。 >なぜって・・・ためしにdeleteしないでやってみたんですが >コンパイルはとおりますが、PCが固まってしまいます。 numのせいでしょう、おそらく。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>結局、deleteはどうなるんでしょう? for(i=0;i<num;i++){ Neko *y=new Neko; x.push_back(*y); delete y; //ここ }
お礼
これだとせっかく作ったのに すぐに消さなきゃいけないじゃないですか?
- 8oo
- ベストアンサー率0% (0/1)
答えではありません。 まずnumの値が不定です。 mallocやnewして確保したポインタは確保した人が管理しなければい けけない事をご存知でしょうか? (free , delete しなければいけません。) x.push_back(*y); >vectorにはポインタではなくオブジェクトが >入っていることに注意してください。 これは値が不定なNeko型変数をvectorにpushしています。 確保したアドレスはどこに保存しているのでしょうか? これではdeleteするアドレスを失ってしまっています。 delete [] x; xは確保したアドレスが入っていますか? xはスタックフレーム上のvectorコンテナです。 なぜdeleteするのでしょうか? delete[]は確保した配列を開放します。 xは配列でしょうか?
お礼
ありがとうございます。 >確保したアドレスはどこに保存しているのでしょうか? >これではdeleteするアドレスを失ってしまっています。 結論として、vectorにオブジェクトを格納するのは不可能ということですか? >なぜdeleteするのでしょうか? なぜって・・・ためしにdeleteしないでやってみたんですが コンパイルはとおりますが、PCが固まってしまいます。 >xは配列でしょうか? いえ、vectorです。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>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(); でしたらわかっていただけます?
お礼
ありがとうございます。 結局、deleteはどうなるんでしょう? Neko n; vector <Neko> x; などを書き直し、 delete y; delete x; delete [] x; としてみましたが、やはりコンパイルエラーです。
お礼
No.7さんへのお礼と同じ状況です。