1

私のクラスにはポインタベクトルがあります:

ptr_vector<Class> vec;

そして、いくつかの「セットアップ」メソッドでは、ベクターにいくつかのクラスを追加します。

void setupOrSomething()
{
    vec.push_back(new Class(...));
    ....
}

これで、このクラスのクライアントは、クラスオブジェクトをこのクラスリストに追加したいと思うかもしれません。

void addThingToMyList(Class *cPointer)
{
    vec.push_back(cPointer);
}

そして、彼らは同じポインタを渡すことによってそれらを削除したいと思うかもしれません:

void removeThingFromMyList(Class *cPointer) { ... }

正しく理解できれば、この回答(https://stackoverflow.com/a/357043/48998)を読んだ後、次のようにそのメソッドを実装する必要があります。

void removeThingFromMyList(Class *cPointer)
{
    vec.release(std::find_if(vec.begin(),vec.end(),CheckPointerValue(cPointer)).release();
}

struct CheckPointerValue
{
     CheckPointerValue(Class* c):cptr(c) {}
     bool operator()(Class const& X)    { return &X == cptr;}
     private:
        Class* cptr;
};

また、ptr_vector.release()から返されるauto_ptrでrelease()をもう一度呼び出す必要があることを理解しています。

これにより、このメソッドの呼び出し元(RemoveThing ...)がそのClassオブジェクトへの有効な参照を保持し、削除されないことが保証されると想定して正しいですか?私は単にvecに一時的な所有権を取得してからそれを放棄したいだけです。

4

1 に答える 1

1

はい、有効なインスタンスへのポインタを保持します。もちろん、ポインタが最初に有効なインスタンスを参照していること、およびそのインスタンスへのポインタがベクトルに格納されていることを知っておく必要があります。そうでない場合は、未定義の動作とおそらくセグメンテーション違反が発生します。

于 2012-05-21T02:11:53.140 に答える