Valid use of shared_ptr?
Is the following a valid use of shared_ptr?
What I want to do is to be able to create a class on the heap or on the
stack using shared_ptr, but also to be able to get a shared_ptr to it
irrespective of whether it is on the stack or heap.
The following seems to work, if USE_DUMMY_SHARED_POINTER is defined,
but is it correct?
regards
Andy Little
//--------------
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
// MSVC specific stuff to check memory leaks
#if defined (_MSC_VER) && defined(_DEBUG)
#include <crtdbg.h>
#endif
namespace std_tr1 = boost;
struct null_deleter
{
void operator()(void const*) const
{
}
};
// if defined puts a dummy shared_ptr in the class
#define USE_DUMMY_SHARED_POINTER
// class where I want to be able
// to get a shared_pointer to it
// via get_ptr function
struct my : std_tr1::enable_shared_from_this<my>
{
typedef std_tr1::shared_ptr<my> ptr;
#ifdef USE_DUMMY_SHARED_POINTER
ptr dummy_shared_ptr;
#endif
my(){
#ifdef USE_DUMMY_SHARED_POINTER
ptr temp(this,null_deleter());
dummy_shared_ptr = temp;
#endif
}
ptr get_ptr()
{
return shared_from_this();
}
};
int main()
{
try{
// try stack alloc
my x;
my::ptr px = x.get_ptr();
if( px.get() == &x){
std::cout << "ptr to x checks ok\n";
}
else {
std::cout << "ptr to x bad\n";
}
// try heap alloc under shared_ptr management
my::ptr x_ptr = my::ptr(new my());
my::ptr px_ptr = x_ptr->get_ptr();
if( px_ptr == x_ptr){
std::cout << "ptr to x_ptr checks ok\n";
}
else {
std::cout << "ptr to x_ptr bad\n";
}
// try raw alloc
my* raw_pointer = new my();
my::ptr raw_ptr = raw_pointer->get_ptr();
if( raw_pointer == raw_ptr.get()){
std::cout << "ptr to raw_ptr checks ok\n";
}
else {
std::cout << "ptr to raw_ptr bad\n";
}
delete raw_pointer;
std::cout << "no exceptions\n";
}
catch (std::exception & e){
std::cout << e.what() <<'\n';
}
//msvc leak checks
#if defined (_MSC_VER) && defined(_DEBUG)
#define SET_CRT_DEBUG_FIELD(a) \
_CrtSetDbgFlag((a) | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG))
#define CLEAR_CRT_DEBUG_FIELD(a)\
_CrtSetDbgFlag(~(a) & _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG))
SET_CRT_DEBUG_FIELD( _CRTDBG_LEAK_CHECK_DF );
#endif
}
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]