3

最も一般的な再利用可能な参照カウント オブジェクトは、プライベート継承を使用して再利用を実装します。私はプライベート継承の大ファンではないので、これが許容できる処理方法であるかどうかに興味があります。

class ReferenceCounter {
    std::size_t * referenceCount;
public:
    ReferenceCounter()
        : referenceCount(NULL) {};
    ReferenceCounter(ReferenceCounter& other)
        : referenceCount(other.referenceCount) {
            if (!referenceCount) {
                referenceCount = new std::size_t(1);
                other.referenceCount = referenceCount;
            } else {
                ++(*referenceCount);
            }
    };
    ReferenceCounter& operator=(const ReferenceCounter& other) {
            ReferenceCounter temp(other);
            swap(temp);
            return *this;
    };
    void swap(ReferenceCounter& other) {
        std::swap(referenceCount, other.referenceCount);
    };
    ~ReferenceCounter() {
        if (referenceCount) {
            if (!*referenceCount)
                delete referenceCount;
            else
                --(*referenceCount);

        }
    };
    operator bool() const {
        return referenceCount && (*referenceCount != 0);
    };
};

class SomeClientClass {
    HANDLE someHandleThingy;
    ReferenceCounter objectsStillActive;
public:
    SomeClientClass() {
        someHandleThingy = RegCreateKeyEx(...);
    }
    ~SomeClientClass() {
        if (objectsStillActive)
            return;
        RegCloseKey(someHandleThingy);
    };
};

または、私が見ていないこれに微妙な問題がありますか?

編集
私はこの特定の実装にあまり関心がありません(おそらくバグがあります-本番コードでこのようなものを使用する前に、shared_ptrの内部を調べることに時間を費やします)-一般的には心配です再利用可能な参照カウント機能が常に構成ではなく継承を使用して実装されているように見える特定の理由があります。

4

3 に答える 3

3

ハンドルをコピーするときは、カウンターをコピーすることを忘れないでください。オペレーティング システムの種類をテンプレートに渡したくないかもしれませんが、ここでの安全性には継承が必要だと思います。(ただし、 からの継承ではありませんHANDLE。)

HANDLEこれは POD であるため、特殊なケースである可能性もあります。基本的に、 以外のタイプのポインターがありますT*

deleteカウントがゼロになったときにそれ以外の何かが発生することを望む動機がわかります。の適応smart_ptrはおそらくうまくいくでしょう、そしてあなたはそれからそれほど遠くないかもしれません.

于 2010-04-15T01:53:08.250 に答える
0

HANDLE実際、クラスの外側に参照カウントを実装していHANDLEます...これはshared_ptr.

参照カウントを実装するためにコンポジションを使用することは問題ありませんが、参照カウント オブジェクトReferenceCounterがクラスHANDLEインスタンスを所有していた方がよいでしょう...すべてのコンストラクター (arg)。

プライベート継承を使用する唯一の正当な理由はEmpty Base Optimization、他のすべてのケースは結合の点ではるかに優れた構成で処理できるため、そうする正当な理由があるとは考えにくく、間違いや怠惰からそれを行った可能性が高いです。 .

于 2010-04-15T06:40:38.640 に答える
0

これには何のメリットもないと思います。参照カウントは、共有オブジェクトに対してのみ意味があります。目標は、とりわけヒープ割り当てやコピーを節約することです。実際、あなたは一種のcopy counterを実装しました。ただし、カウンター値を照会するためのインターフェイスが提供されていないため、それでも役に立ちません。再訪をお勧めしboost::intrusiveますか?

于 2010-04-15T02:08:30.610 に答える