C++ vectorのメモリについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
mura

C++ vectorのメモリについて

#1

投稿記事 by mura » 11年前

今、マインスイーパ的なゲームを作っているんですが…

Panelというクラスと
Mineというクラスを持ち、
両方を管理するBoardクラスがあります。
持ち方としてはPanelは2次元vector、Mineは1次元vectorです。
Panel(正方形)もMineもゲームのたびに数を変化させたいからです。
というわけで、Boardクラスに、ゲーム開始時に呼び出しする
void Reset(int);
を作り、その中でPanelとMineをそれぞれリセットするという風にしました。
ところがこの方法だと、何回もリセットしてるうちにメモリ使用量がどんどん増えていきます。
ついには応答がなくなってしまいます。

vectorのメモリがふえつづけているのが原因と考えて、swap手法を使ったのですが、
それでもうまくいきません。
なぜでしょうか?

コード:

	void Reset(int MaxBoardSquare_){
		MaxBoardSquare=MaxBoardSquare_;
		panel.clear();
		std::vector< std::vector<Panel> >(panel).swap(panel);
		for(int i=0;i<MaxBoardSquare;i++){
			panel.push_back(std::vector<Panel>());
			for(int j=0;j<MaxBoardSquare;j++){
				panel[i].push_back(Panel(MaxBoardSquare));
				panel[i][j].Reset(i,j);
			}
		}

		mine_num=Ns::GetRand(6)+MaxBoardSquare_*MaxBoardSquare_/10;
		mine.clear();
		std::vector<Mine>(mine).swap(mine);
		for(int i=0;i<mine_num;i++){
			mine.push_back( Mine(Panel::GetExRate()) );
		}
		for(int i=0;i<mine_num;i++){
			ResetMinePos(i);
		}
	}

アバター
せんちゃ
記事: 50
登録日時: 14年前
住所: 江別市東野幌町
連絡を取る:

Re: C++ vectorのメモリについて

#2

投稿記事 by せんちゃ » 11年前

mura さんが書きました: vectorのメモリがふえつづけているのが原因と考えて、swap手法を使ったのですが、
それでもうまくいきません。
「考えて」ということはまだvectorが原因であるという確証までには至っていないということでしょうか。
capacityメソッドから実際に確保しているメモリサイズが手に入りますが一旦それで本当にvectorのメモリが増え続けているのか確認をとってみてはいかがでしょうか?
ヽ(*゚д゚)ノ カイバー

かずま

Re: C++ vectorのメモリについて

#3

投稿記事 by かずま » 11年前

mura さんが書きました:持ち方としてはPanelは2次元vector、Mineは1次元vectorです。
class Panel と class Mine の宣言はどうなっているのでしょうか?
mura さんが書きました:

コード:

    panel.clear();
    std::vector< std::vector<Panel> >(panel).swap(panel);
panel は、Panel panel; で宣言されたインスタンス(オブジェクト)でしょうか?
Panel が 2次元vector なら、std::vector< std::vector<Panel> > は
4次元vector ということになりますが、本当にそれでよいのでしょうか?
std::vector< std::vector<Panel> >(panel) は、コンストラクタの
呼び出しなので、一時オブジェクトを生成し、
それと panel を swap() しても何も残らないと思います。

かずま

Re: C++ vectorのメモリについて

#4

投稿記事 by かずま » 11年前

ソースを眺めていて、次の結論に達しました。

Panel は 2次元vector ではない。

std::vector< std::vector<Panel> > panel;
と宣言された panel が 2次元vector であり、その要素である Pannel は、
Panel(int) というコンストラクタと、
void Reset(int, int) というメンバ関数と、
int GetExRate() という static メンバ関数を持つクラスである。

閉鎖

“C言語何でも質問掲示板” へ戻る