こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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にはポインタではなくオブジェクトが
入っていることに注意してください。

投稿日時 - 2004-02-27 18:08:08

QNo.791495

困ってます

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.8

> Neko *y=new Neko;
> x.push_back(*y);

x.push_bach(Neko());

とやれば、deleteなんかしなくていい(してはならない)のですけど。

投稿日時 - 2004-02-28 07:44:56

お礼

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

投稿日時 - 2004-02-28 10:39:16

ANo.7

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

いいんですよ、ここで消しても。

>入っているのはvector::push_back内部で作成されたオブジェクトでは?

ということなんですから。

#1で書いたソース、試していただけました?
newしたオブジェクトがvectorが破棄されるまでずっと必要なんてことでしたら、
x[0].Naku();
x[1].Naku();
x[2].Naku();
の出力結果、みんな同じになっちゃいますよね。
理解していただけました?

投稿日時 - 2004-02-28 00:29:15

お礼

やっぱりできません。
コンパイルは通りますが、メッセージは何も出てきません。

念のため、今、実行したプログラムを載せておきます。


#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();
}

投稿日時 - 2004-02-28 10:37:30

ANo.6

8oo

>不定じゃないですよ。

失礼。
メンバ変数はstd:stringだけでしたね。
よく見てませんでした。

投稿日時 - 2004-02-27 21:21:43

ANo.5

8oo

>不定じゃないですよ。

でしたら、どんな値かおしえてください。

投稿日時 - 2004-02-27 21:17:26

ANo.4

>これは値が不定なNeko型変数をvectorにpushしています。

不定じゃないですよ。
newでインスタンス作成してます。当然このタイミングで
デフォルトコンストラクタ呼ばれますし。


>なぜって・・・ためしにdeleteしないでやってみたんですが
>コンパイルはとおりますが、PCが固まってしまいます。

numのせいでしょう、おそらく。

投稿日時 - 2004-02-27 19:39:23

ANo.3

>結局、deleteはどうなるんでしょう?

for(i=0;i<num;i++){
Neko *y=new Neko;
x.push_back(*y);
delete y; //ここ
}

投稿日時 - 2004-02-27 19:27:01

お礼

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

投稿日時 - 2004-02-27 23:03:07

ANo.2

8oo

答えではありません。

まずnumの値が不定です。

mallocやnewして確保したポインタは確保した人が管理しなければい
けけない事をご存知でしょうか?
(free , delete しなければいけません。)

x.push_back(*y);
>vectorにはポインタではなくオブジェクトが
>入っていることに注意してください。

これは値が不定なNeko型変数をvectorにpushしています。
確保したアドレスはどこに保存しているのでしょうか?
これではdeleteするアドレスを失ってしまっています。

delete [] x;
xは確保したアドレスが入っていますか?
xはスタックフレーム上のvectorコンテナです。
なぜdeleteするのでしょうか?
delete[]は確保した配列を開放します。
xは配列でしょうか?

投稿日時 - 2004-02-27 18:47:08

お礼

ありがとうございます。

>確保したアドレスはどこに保存しているのでしょうか?
>これではdeleteするアドレスを失ってしまっています。

結論として、vectorにオブジェクトを格納するのは不可能ということですか?

>なぜdeleteするのでしょうか?

なぜって・・・ためしにdeleteしないでやってみたんですが
コンパイルはとおりますが、PCが固まってしまいます。

>xは配列でしょうか?

いえ、vectorです。

投稿日時 - 2004-02-27 19:11:59

ANo.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();

でしたらわかっていただけます?

投稿日時 - 2004-02-27 18:35:44

お礼

ありがとうございます。

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

投稿日時 - 2004-02-27 19:04:44

あなたにオススメの質問