가장 일반적으로 재사용 가능한 참조 카운트 된 개체는 재사용을 구현하기 위해 개인 상속을 사용합니다. 나는 개인 상속의 거대한 팬이 아니에요,이 일을 처리 허용 방법입니다 있을지 궁금 :구성을 통해 참조 횟수를 구현하는 것이 괜찮습니까?
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를 파괴하고 있음을 나타내는 0입니다. 따라서 size_t 포인터의 할당을 해제해야합니다. –
@Billy :하지만 이제 카운터를 지웠으므로 컨트롤 개체를 삭제할지 여부를 결정하기 위해 카운터를 읽을 수 없습니다. 참조 카운트 된 것으로 보이는 유일한 것은 카운터 자체입니다. 내가 인터페이스의 일부 지점을 놓치고있는 것 같아요. – Potatoswatter
마지막 ReferenceCount 개체가 파괴되는 경우 아무도 카운터에 다시 액세스하지 못합니다. –