ページ 11

アロケータ

Posted: 2009年3月04日(水) 22:46
by ibis
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は普通に動くんですが。

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

Re:アロケータ

Posted: 2009年3月07日(土) 16:18
by TOMONORI
> 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; 
の&の意味がよくわからないのですが、どういう意味でしょうか?

Re:アロケータ

Posted: 2009年3月07日(土) 21:02
by ibis
ご返答ありがとうございます。

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

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

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

Re:アロケータ

Posted: 2009年3月07日(土) 22:05
by Justy

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

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

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

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

Re:アロケータ

Posted: 2009年3月08日(日) 00:49
by ibis
あ、一時オブジェクトのデストラクタですか。
Blockクラスに開放フラグつけてみたら正常に動きました。
ありがとうございます。

Re:アロケータ

Posted: 2009年3月08日(日) 00:49
by ibis
解決マーク付け忘れました。