動的に割り当てられた型または から派生した型のすべてのインスタンスを削除するP
、静的メンバー関数を持つクラスが必要です。delete_all
P
P
ここに私が持っているものがあります:
#include <unordered_set>
using namespace std;
struct P
{
static unordered_set<P*> pool;
static void* operator new(size_t size)
{
void* p = ::operator new(size);
pool.insert(static_cast<P*>(p));
return p;
}
static void operator delete(void* p)
{
pool.erase(static_cast<P*>(p));
::operator delete(p);
}
static void delete_all()
{
while (!pool.empty())
delete *(pool.begin());
}
virtual ~P() {}; // polymorphic
};
unordered_set<P*> P::pool;
使用例は次のようになります。
struct D : P
{
...
};
int main()
{
D d1;
D* d2 = new D();
D* d3 = new D();
delete d2;
P::delete_all(); // deletes d3, but not d1 or d2
}
私が懸念している部分は、void*
ポインターをに静的にキャストすることP*
です。これは、場合によっては未定義の動作につながると感じています。たとえば、派生クラスの先頭で P 基本クラスのサブオブジェクトが開始されていない派生クラスで new が呼び出された場合などです。メモリ ブロックは、それが派生クラスの型であることをまだ認識していないため、static_cast<P*>
from void は P サブオブジェクトの正しい位置を示しません。
これが問題であるというのは正しいですか?どうすれば修正できますか?
P
また、私が気付いていない追加の問題はありますか?