アロケータ

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

アロケータ

#1

投稿記事 by ibis » 16年前

std::allocatorがちょっとわからないです。
下記のようなメンバ関数があるのですが、期待通りの動作をしてくれません。

//template<typename, typename>class Block;
//typedef T ValueType;
//typedef Block<T, std::allocator<T> > BlockType;
//std::allocator<T> &value_allocator;
//std::allocator<Block<T, std::allocator<T> > > &block_allocator;
BlockType *allocate_one(ValueType &value){
	ValueType *v = value_allocator.allocate(1);
	value_allocator.construct(v, value);
	BlockType *b = block_allocator.allocate(1);
	block_allocator.construct(b, BlockType(v, 1));
	/**/std::printf("%p, %p", v, b);
	return b;
}
・value_allocator.allocateが毎回同じ値を返す。(初めてblock_allocator.allocateを呼ぶときの返り値よりも0x10だけ小さいアドレスを毎回返してくる)
・value_allocator.constructによってvが指してる値は変わらない。
gccとbcc32で試しましたが、どちらもこのような動作をします。
block_allocatorは普通に動くんですが。

なぜこうなるのか全くわからないです。
お手数ですが御教授願います。

TOMONORI

Re:アロケータ

#2

投稿記事 by TOMONORI » 16年前

> value_allocator.allocateが毎回同じ値を返す

呼び出すごとにメモリを開放しているならそうなるとおもいます。

> 初めてblock_allocator.allocateを呼ぶときの返り値よりも0x10だけ小さいアドレスを毎回返してくる

繰り返して実行するなら大きなアドレスを返すと思いますけど・・・
一応BCCとVC++でやったら大きな値返してましたよ?

> value_allocator.constructによってvが指してる値は変わらない。

これも自分のところではちゃんと変化しました。

再現可能な形でほか(Blockとか)の実装も挙げてもらえますか?

あと最初の2文、
> //std::allocator<T> &value_allocator; 
> //std::allocator<Block<T, std::allocator<T> > > &block_allocator; 
の&の意味がよくわからないのですが、どういう意味でしょうか?

ibis

Re:アロケータ

#3

投稿記事 by ibis » 16年前

ご返答ありがとうございます。

>呼び出すごとにメモリを開放しているならそうなるとおもいます。
開放はしてないはずなんですが・・・

>再現可能な形でほか(Blockとか)の実装も挙げてもらえますか?
やっぱり他の箇所に原因があるかもしれないですか・・・
一応実行可能ファイルも含めて添付しときます。

>&の意味がよくわからないのですが
アロケータのインスタンスが別の所にありまして、メンバとしてはそれの参照を保持してます。

Justy

Re:アロケータ

#4

投稿記事 by Justy » 16年前


>開放はしてないはずなんですが・・

 解放しているように見えますよ。

block_allocator.construct(b, BlockType(v, 1));

 この BlockType(v, 1)を引数に construct()が終わった後、
BlockTypeのデストラクタが実行されて、deallocate()されています。

ibis

Re:アロケータ

#5

投稿記事 by ibis » 16年前

あ、一時オブジェクトのデストラクタですか。
Blockクラスに開放フラグつけてみたら正常に動きました。
ありがとうございます。

ibis

Re:アロケータ

#6

投稿記事 by ibis » 16年前

解決マーク付け忘れました。

閉鎖

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