0
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <vector>
using namespace std;

struct delete_ptr
{
    template<typename T>
    void operator()(T*& t)
    {
        delete t;
        t = 0;
    }
};

struct is_null_ptr
{
    template<typename T>
    bool operator()(T*& t)
    {
        return t == 0;
    }
};

struct A
{
    static void removeDead(A*& a)
    {
        if(a and a->dead)
            delete_ptr()(a);
    }

    static void killSome(A* a)
    {
        if(a and a->isDead() == false and rand()%100 == 0)
        {
            static int counter = 0;
            cout << "Kill___" << ++counter << endl;
            a->kill();
        }
    }

    static void reviveSome(A* a)
    {

        if(a and a->isDead() and rand()%3 == 0)
        {
            static int counter = 0;
            cout << "Revive___" << ++counter << endl;
            a->revive();
        }
    }

    A():dead(false)
    {

    }

    virtual ~A()
    {
        static int counter = 0;
        cout << "Dtor___" << ++counter << endl;
    }

    bool isDead(){return dead;}
    void kill(){dead = true;}
    void revive(){dead = false;}

    bool dead;
};

int main()
{
    srand(time(0));
    vector<A*> as;
    for(int i = 0; i < 200; ++i)
    {
        A* a = new A;
        as.push_back(a);
    }


    for_each(as.begin(),as.end(),A::killSome);
    for_each(as.begin(),as.end(),A::reviveSome);

    for_each(as.begin(),as.end(),A::removeDead);
    as.erase( std::remove_if(as.begin(),as.end(),is_null_ptr()),as.end());
    cout << as.size() << endl;

    for_each(as.begin(),as.end(),delete_ptr());
    as.clear();

    return 0;
}

それらを割り当て、正しい出力を出力しますが、これが正しいことかどうかはわかりません。ブーストやc ++ 11を使用せずに、ベクターでポインターを使用して、特定の条件が発生したときにそれらを削除しようとしていました。それで、あなたはそれについてどう思いますか?

4

1 に答える 1

1

現在の STL (auto_ptr) に存在する唯一のスマート ポインターはコンテナーで使用できないため、与えられた条件下では、あなたの方法は良い方法であると言えます。

ただし、独自の unique_ptr または shared_ptr を実装することを考えることができます。

PS: コンテナー内の実際のオブジェクトの代わりにポインターを使用する理由はたくさんありますが、その 1 つはポリモーフィズムです。もう 1 つは、実際のオブジェクトが既に別の場所に格納されていることです (既に格納されているオブジェクトへのインデックス構造を考えてみてください)。

于 2012-09-10T12:59:47.830 に答える