2016-01-13 67 views
1

我正在写一个库。带保留计数的C++基类

没有使用智能指针。它是否足够安全地模仿保留/释放行为?

或者是否有任何库已经在做这样的事情?

class FooBase { 

private: 
    std::atomic<uint32_t> m_retainCount; 

public: 
    FooBase() 
    { 
     m_retainCount = 1; 
    }; 

    virtual ~FooBase() 
    { 
     assert(m_retainCount == 0); // Prevent from direct delete without release() 

     //clean-up if any 
    }; 

    void *release() 
    { 
     m_retainCount--; 
     if (!m_retainCount) 
      delete this; 

     return this; 
    }; 

    void *retain() 
    { 
     m_retainCount++; 

     return this; 
    }; 

}; 
+0

以什么方式安全? – immibis

+0

线程安全,您可以想到的任何问题。 – Wonson

+4

为什么要编写一个不使用智能指针的库?由于缺乏编译器支持,我明白不能使用C++ 11和C++ 14的功能,但是不管怎么说,智能指针都支持*无处不在*。 –

回答

2

想象一下,如果您的线程在发布的分支之后和删除的呼叫之前立即交换。

另一个线程可能会来请求一个保留,因此获得一个指向即将被删除的对象的指针。

+0

是的,thx为您的评论,而不是促进智能指针。只要找出你提到的问题:如果thread1已经在“删除此;”行,但thread2来保留它在这一点上。 – Wonson

+0

有没有简单的方法来解决这个问题? – Wonson

+0

如何使用std :: mutex来锁定它? – Wonson

2

要回答第二部分,std::shared_ptr是线程安全的。由于它是编译器的正式组成部分,因此它具有能够在内部使用非可移植技巧的额外好处。