最常見的可重用引用計數對象使用私有繼承來實現重用。我不是私有繼承的一個巨大的風扇,和我很好奇,如果這是處理事情能夠接受的方式:可以通過構圖實現引用計數嗎?
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的內臟) - 我只關心,如果一般有一個具體的原因可重複使用的引用計數好吃的東西似乎總是使用繼承而不是組合實現。
如果發生這種情況,則會複製A. ReferenceCount對象(因爲referenceCount不是NULL指針),並且B. referenceCount爲零,表示我們正在銷燬組中的最後一個ReferenceCount。所以size_t指針需要被釋放。 – 2010-04-15 01:55:15
@Billy:但是現在你已經擦除了計數器,你不能讀取它來確定是否刪除受控對象。這裏似乎只是參考計數的唯一東西就是櫃檯本身。我想我錯過了一些界面。 – Potatoswatter 2010-04-15 01:58:01
如果最後一個ReferenceCount對象被銷燬,無論如何,沒有人會再次訪問計數器。 – 2010-04-15 01:59:12