Refcounting smart pointer?

Bill Baxter wbaxter at gmail.com
Wed Sep 3 17:42:55 PDT 2008


I don't think such things usually are thread safe.
At least Boost's is not:
  http://www.boost.org/doc/libs/1_36_0/libs/smart_ptr/shared_ptr.htm#ThreadSafety

--bb

On Thu, Sep 4, 2008 at 9:33 AM, Jason House <jason.james.house at gmail.com> wrote:
> Your implementation is not thread safe...
>
> Sönke Ludwig Wrote:
>
>> Bill Baxter schrieb:
>> > Has anyone made a reference counting smart pointer using D2 structs yet?
>> > It should be possible now with the opDot, destructors, postblit thingy
>> > and constructor.
>> >
>> > Is anything missing to make it work?  Actually I don't even think the
>> > constructor was necessary.  So someone probably could have done this a
>> > while ago.
>> >
>> > --bb
>>
>> Just implemented this today, and it seems to work fine:
>>
>> struct CountedRef(T) {
>>       static if( is(T == class) ){
>>               alias T T_ref;
>>       } else {
>>               alias T* T_ref;
>>       }
>>
>>       private {
>>               T_ref m_object;
>>               int* m_refcount;
>>       }
>>
>>       this(T_ref obj){
>>               m_object = obj;
>>               m_refcount = new int;
>>               *m_refcount = 1;
>>       }
>>
>>       ~this(){
>>               if( m_refcount && --(*m_refcount) <= 0 ){
>>                       delete m_object;
>>                       delete m_refcount;
>>               }
>>       }
>>
>>       this(this){
>>               if( m_refcount )
>>                       (*m_refcount)++;
>>       }
>>
>>       T_ref get(){ return m_object; }
>>       const(T_ref) get() const { return m_object; }
>>
>>       T_ref opDot(){ return m_object; }
>>       const(T_ref) opDot() const { return m_object; }
>> }
>>
>> struct IntrusiveCountedRef(T) {
>>       static if( is(T == class) ){
>>               alias T T_ref;
>>       } else {
>>               alias T* T_ref;
>>       }
>>
>>       private {
>>               T_ref m_object;
>>       }
>>
>>       this(T_ref obj){
>>               m_object = obj;
>>               obj.addRef();
>>       }
>>
>>       ~this(){
>>               if( m_object )
>>                       m_object.releaseRef();
>>       }
>>
>>       this(this){
>>               if( m_object )
>>                       m_object.addRef();
>>       }
>>
>>       T_ref get(){ return m_object; }
>>       const(T_ref) get() const { return m_object; }
>>
>>       T_ref opDot(){ return m_object; }
>>       const(T_ref) opDot() const { return m_object; }
>> }
>
>



More information about the Digitalmars-d mailing list