2

動的に割り当てられた型または から派生した型のすべてのインスタンスを削除するP、静的メンバー関数を持つクラスが必要です。delete_allPP

ここに私が持っているものがあります:

#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また、私が気付いていない追加の問題はありますか?

4

1 に答える 1