ぼく用あれこれまとめ
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>っていうのがある。