这就是我公司在C ++中实现引用计数对象的方法:
#ifndef DECLARE_REF_COUNT
#define DECLARE_REF_COUNT \
public: \
void Ref() { atomic_inc(_refs); } \
void UnRef() { \
int n = atomic_dec(_refs); \
if (n <= 0) { \
delete this; \
} \
} \
private: \
volatile int _refs;
#endif
因此,当您需要创建引用计数类时,您可以:
class MyClass {
DECLARE_REF_COUNT;
public:
...
};
使用它时,您可以:
myobj->Ref();
...
myobj->UnRef();
我建议使用共享指针指向我的领导者,因为它不需要手动Ref和UnRef,但我的领导者更喜欢Macro方式,他告诉我,我们不会忘记打电话给UnRef(因为它是如此基本,我们不会雇用那些忘记这样做的人。他更喜欢使用Macro的另一个原因是,当需要一些显式的Ref和UnRef时,它会提供更多控制。所以假设没有提升和没有c ++ 11,Macro是一个很好的方法吗?这种方式的优势和劣势是什么?
答案 0 :(得分:1)
如果每个人都像你的领导者一样合格,我们就不需要创建智能指针。
但是,唉,我们做到了。
我会推荐基于宏的基类。
*
class RefCounted
{
public:
void Ref() { ... }
void UnRef() { ... }
private:
volatile int _refs;
}
class MyClass : public RefCounted
及其后的核心原则之一是减少对手动资源管理的需求。像c++11
和std::shared_ptr
之类的东西是为了解决这个问题而创建的。 RAII类也可以在没有C ++ 11的情况下编写,强烈建议使用。