Placement New
- class Pool {
- public:
- Pool() { /* implementation details irrelevant */ };
- virtual ~Pool() { /* ditto */ };
-
- virtual void *allocate(size_t);
- virtual void deallocate(void *);
-
- static Pool::misc_pool() { return misc_pool_p; /* global MiscPool for general use */ }
- };
-
- class ClusterPool : public Pool { /* ... */ };
- class FastPool : public Pool { /* ... */ };
- class MapPool : public Pool { /* ... */ };
- class MiscPool : public Pool { /* ... */ };
-
- // elsewhere...
-
- void *pnew_new(size_t size)
- {
- return Pool::misc_pool()->allocate(size);
- }
-
- void *pnew_new(size_t size, Pool *pool_p)
- {
- if (!pool_p) {
- return Pool::misc_pool()->allocate(size);
- }
- else {
- return pool_p->allocate(size);
- }
- }
-
- void pnew_delete(void *p)
- {
- Pool *hp = Pool::find_pool(p);
- // note: if p == 0, then Pool::find_pool(p) will return 0.
- if (hp) {
- hp->deallocate(p);
- }
- }
-
- // elsewhere...
-
- class Obj {
- public:
- // misc ctors, dtors, etc.
-
- // just a sampling of new/del operators
- void *operator new(size_t s) { return pnew_new(s); }
- void *operator new(size_t s, Pool *hp) { return pnew_new(s, hp); }
- void operator delete(void *dp) { pnew_delete(dp); }
- void operator delete(void *dp, Pool*) { pnew_delete(dp); }
-
- void *operator new[](size_t s) { return pnew_new(s); }
- void *operator new[](size_t s, Pool* hp) { return pnew_new(s, hp); }
- void operator delete[](void *dp) { pnew_delete(dp); }
- void operator delete[](void *dp, Pool*) { pnew_delete(dp); }
- };
-
- // elsewhere...
-
- ClusterPool *cp = new ClusterPool(arg1, arg2, ...);
-
- Obj *new_obj = new (cp) Obj(arg_a, arg_b, ...);
http://stackoverflow.com/questions/222557/what-uses-are-there-for-placement-new