C ++引用计数:使用宏来做任何优势吗?

时间:2016-08-26 15:08:48

标签: c++ macros smart-pointers

这就是我公司在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是一个很好的方法吗?这种方式的优势和劣势是什么?

1 个答案:

答案 0 :(得分:1)

如果每个人都像你的领导者一样合格,我们就不需要创建智能指针。

但是,唉,我们做到了。

我会推荐基于宏的基类。

*

class RefCounted { public: void Ref() { ... } void UnRef() { ... } private: volatile int _refs; } class MyClass : public RefCounted 及其后的核心原则之一是减少对手动资源管理的需求。像c++11std::shared_ptr之类的东西是为了解决这个问题而创建的。 RAII类也可以在没有C ++ 11的情况下编写,强烈建议使用。