#include <iostream> // std::cout
#include <vector> // std::vector
#include <thread> // std::thread
#include <mutex> // std::mutex, std::unique_lock, std::defer_lock
#include "stdio.h"
class B;
template < typename T>
class shared_ptr {
public :
shared_ptr( ) : count( 0 ) ,_ptr( nullptr) { }
shared_ptr( T* p) : count( new int ( 1 ) ) , _ptr( p) { printf ( "new int %d,count = %d\n " ,* this ,* count) ; }
shared_ptr( shared_ptr< T> & other) : count( & ( ++* other.count ) ) , _ptr( other._ptr) { printf ( "copy run count=%d\n " ,* count) ; }
T* operator- > ( ) { return _ptr; }
T& operator* ( ) { return * _ptr; }
shared_ptr< T> & operator= ( shared_ptr< T> & other)
{
++* other.count ;
if ( this- > _ptr && 0 == --* this- > count)
{
delete count;
delete _ptr;
}
this- > _ptr = other._ptr;
this- > count = other.count ;
printf ( "= run %d,count = %d\n " ,* this ,* count) ;
return * this ;
}
~shared_ptr( )
{
if ( --* count == 0 )
{
//delete count;
//delete _ptr;
}
printf ( "distory run %d,%d\n " ,* this ,* count) ;
}
int getRef( ) { return * count; }
private :
int * count;
T* _ptr;
} ;
class A
{
public :
A( ) { printf ( "A construct run\n " ) ; } ;
~A( ) { printf ( "A disconstruct run\n " ) ; } ;
shared_ptr< B> m_b;
} ;
class B
{
public :
B( ) { printf ( "B construct run\n " ) ; } ;
~B( ) { printf ( "B disconstruct run\n " ) ; } ;
shared_ptr< A> m_a;
} ;
int main( )
{
// A a;
// B b;
shared_ptr< A> a( new A) ; //new出来的A的引用计数此时为1
shared_ptr< B> b( new B) ; //new出来的B的引用计数此时为1
a- > m_b = b; //B的引用计数增加为2
b- > m_a = a; //A的引用计数增加为2
}
I2luY2x1ZGUgPGlvc3RyZWFtPiAgICAgICAvLyBzdGQ6OmNvdXQKI2luY2x1ZGUgPHZlY3Rvcj4gICAgICAgICAvLyBzdGQ6OnZlY3RvcgojaW5jbHVkZSA8dGhyZWFkPiAgICAgICAgIC8vIHN0ZDo6dGhyZWFkCiNpbmNsdWRlIDxtdXRleD4gICAgICAgICAgLy8gc3RkOjptdXRleCwgc3RkOjp1bmlxdWVfbG9jaywgc3RkOjpkZWZlcl9sb2NrCiNpbmNsdWRlICJzdGRpby5oIgpjbGFzcyBCOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIHNoYXJlZF9wdHIgewpwdWJsaWM6CiAgICBzaGFyZWRfcHRyKCkgOiBjb3VudCgwKSxfcHRyKG51bGxwdHIpIHt9CiAgICBzaGFyZWRfcHRyKFQqIHApIDogY291bnQobmV3IGludCgxKSksIF9wdHIocCkge3ByaW50ZigibmV3IGludCAlZCxjb3VudCA9ICVkXG4iLCp0aGlzLCpjb3VudCk7fQogICAgc2hhcmVkX3B0cihzaGFyZWRfcHRyPFQ+JiBvdGhlcikgOiBjb3VudCgmKCsrKm90aGVyLmNvdW50KSksIF9wdHIob3RoZXIuX3B0cikge3ByaW50ZigiY29weSBydW4gY291bnQ9JWRcbiIsKmNvdW50KTt9CiAgICBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gX3B0cjsgfQogICAgVCYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKl9wdHI7IH0KICAgIHNoYXJlZF9wdHI8VD4mIG9wZXJhdG9yPShzaGFyZWRfcHRyPFQ+JiBvdGhlcikKICAgIHsKICAgIAogICAgICAgICsrKm90aGVyLmNvdW50OwogICAgICAgIGlmICh0aGlzLT5fcHRyICYmIDAgPT0gLS0qdGhpcy0+Y291bnQpCiAgICAgICAgewogICAgICAgICAgICBkZWxldGUgY291bnQ7CiAgICAgICAgICAgIGRlbGV0ZSBfcHRyOwogICAgICAgIH0KICAgICAgICB0aGlzLT5fcHRyID0gb3RoZXIuX3B0cjsKICAgICAgICB0aGlzLT5jb3VudCA9IG90aGVyLmNvdW50OwogICAgICAgIHByaW50ZigiPSBydW4gJWQsY291bnQgPSAlZFxuIiwqdGhpcywqY291bnQpOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIH5zaGFyZWRfcHRyKCkKICAgIHsKCiAgICAgICAgaWYgKC0tKmNvdW50ID09IDApCiAgICAgICAgewogICAgICAgICAgICAvL2RlbGV0ZSBjb3VudDsKICAgICAgICAgICAgLy9kZWxldGUgX3B0cjsKICAgICAgICB9ICAgIAogICAgICAgIHByaW50ZigiZGlzdG9yeSBydW4gJWQsJWRcbiIsKnRoaXMsKmNvdW50KTsKICAgIH0KCiAgICBpbnQgZ2V0UmVmKCkgeyByZXR1cm4gKmNvdW50OyB9CnByaXZhdGU6CiAgICBpbnQqIGNvdW50OwogICAgVCogX3B0cjsKfTsKCgoKY2xhc3MgQQp7CnB1YmxpYzoKICAgICBBKCl7cHJpbnRmKCJBIGNvbnN0cnVjdCBydW5cbiIpO307CiAgICAgfkEoKXtwcmludGYoIkEgZGlzY29uc3RydWN0IHJ1blxuIik7fTsKICAgICBzaGFyZWRfcHRyPEI+IG1fYjsKfTsKY2xhc3MgQgp7CnB1YmxpYzoKICAgICBCKCl7cHJpbnRmKCJCIGNvbnN0cnVjdCBydW5cbiIpO307CiAgICAgfkIoKXtwcmludGYoIkIgZGlzY29uc3RydWN0IHJ1blxuIik7fTsKICAgIHNoYXJlZF9wdHI8QT4gbV9hOwp9OwoKaW50IG1haW4oKSAKewovLyAgIEEgYTsKLy8gICBCIGI7CnNoYXJlZF9wdHI8QT4gYShuZXcgQSk7ICAvL25ld+WHuuadpeeahEHnmoTlvJXnlKjorqHmlbDmraTml7bkuLoxCnNoYXJlZF9wdHI8Qj4gYihuZXcgQik7ICAvL25ld+WHuuadpeeahELnmoTlvJXnlKjorqHmlbDmraTml7bkuLoxCmEtPm1fYiA9IGI7ICAgICAgICAgICAgICAvL0LnmoTlvJXnlKjorqHmlbDlop7liqDkuLoyCmItPm1fYSA9IGE7ICAgICAgICAgICAgICAvL0HnmoTlvJXnlKjorqHmlbDlop7liqDkuLoyCn0=