Boost logo

Boost :

From: E. Gladyshev (egladysh_at_[hidden])
Date: 2002-03-22 14:10:36


In my previous post, I looked at using shared_ptr<>
with plain pointers.
The problem is that if a caller passes an object to a
function with a
plain pointer, the caller has to make sure that the
object is
valid while the function is using this object.
In other words a function cannot claim a shared
owenership of an object
if the object is passed in with a plain pointer. This
issue
is especially important in multi-threaded
applications.
The following code won't work of course.

void foo( int* p )
{
        shared_ptr<int> my_int( p ); //claim shared
ownership
}

main()
{
        shared_ptr<int> x( new int );
        foo( x.get() );
} //!!CRASH shared_ptr<> will try to delete an
object that has been deleted by foo().

A very easy solution is to use a global object map.
STL has a logarithmic <map> class. The following
code shows how to do that. This is just a test code.
Do you think if it is a valid idea to be included in
boost?

#include <map>
using namespace std;

typedef map<void*, int*> object_map;

class smart_ptr_base
{
protected:
        static object_map _map;
};

template <typename T>
class smart_ptr : public smart_ptr_base
{
public:

        smart_ptr( T* d )
        {
                pair<object_map::iterator, bool> p;
                p = _map.insert( object_map::value_type( d, new int
) );
                _it = p.first;
                if( p.second ) *(p.first->second) = 1;
                else ++*(p.first->second);
        }

        virtual ~smart_ptr()
        {
                if( !--*(_it->second) )
                {
                        delete (T*)(_it->first);
                        _map.erase( _it );
                }
        }

        //all other standard smart pointer stuff goes here
        //...

protected:
        object_map::iterator _it;
};

object_map smart_ptr_base::_map;

void foo( A* p )
{
        smart_ptr<A> tmp( p ); //claim shared ownership
}

int main(int argc, char* argv[])
{
        A *p = new A();
        smart_ptr<A> tmp( p );
        foo( p );
        return 0;
}

One problem that I'd like to solve is to deal with
pointers
to static objects.
I am not sure if there are any smart pointer
implementations that
can reference static objects. For example:

int g_x;
int main()
{
        share_ptr<int> tmp(&g_x)
} //CRASH

__________________________________________________
Do You Yahoo!?
Yahoo! Movies - coverage of the 74th Academy Awards®
http://movies.yahoo.com/


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk