ぼく用あれこれまとめ

placement new

最終更新:

bokuyo

- view
管理者のみ編集可

placement new


「配置new」と呼ばれるのはなんでだろう?

  • プールを確保しておいて、後から配置するから、配置newっていうのかな?
void *pool	= std::malloc(sizeof(int));
int *a		= new(pool) int;
std::cout << pool << std::endl;
std::cout << a << std::endl;
delete (a, pool);
  • 上記のプログラムを動かすと次のような結果が表示されます。
006247F8		//poolが指すアドレス
006247F8		//aが指すアドレス
  • poolが指すアドレスとaが指すアドレスは同じです。
  • つまり、poolが指すアドレスにmallocで領域を確保し、その領域をaが使用するのです。
  • なのでこの場合、std::malloc()をしていますが、std::free()する必要はありません。
    • aが指す領域はdelete(a, pool)で解放しています。
    • aが指す領域は、poolが指す領域でもありますので、すでにpoolも解放されていることになります。
  • もし、delete(a, pool)したあとに、std::free(pool)をすると、
Windows によって temp.exe でブレークポイントが発生しました。
ヒープが壊れていることが原因として考えられます。test.exe または読み込まれた DLL にバグがあります。
あるいは、test.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。
  • 二重解放すると厄介なことになるのでやめましょう。


replacement new (再配置new)

  • ってのがあるらしい。あとで調べてみよう。



boostで

  • <boost/pool/pool.hpp>っていうのがある。
記事メニュー
目安箱バナー