Re: How to get rid of the new-initializer in a new-expression
In article <61u6p4F21464sU2@mid.individual.net>, Matthias Hofmann
<hofmann@anvil-soft.com> wrote:
"Alberto Ganesh Barbati" <AlbertoBarbati@libero.it> schrieb im Newsbeitrag
news:g2Ztj.248009$%k.378883@twister2.libero.it...
Why don't you simply define your new as:
#define NEW(T) TrackNew(new T)
and let the compiler deduce the type of the argument?
My example was a little simplified. In my original code, TrackNew() looks
more like this:
template <class T>
struct TrackNewImpl
{
static T* TrackNew( MemoryTracker& inst,
T* ptr, const char* file, int line )
{
// Do memory tracking for objects.
return ptr;
}
};
template <class T, std::size_t N>
struct TrackNewImpl<T[N]>
{
static T* TrackNew( MemoryTracker& inst,
T* ptr, const char* file, int line )
{
// Do memory tracking for arrays.
return ptr;
}
};
template <class T> typename extract<T>::type*
TrackNew( typename extract<T>::type* ptr,
const char* file, int line )
{
return TrackNewImpl<T>::TrackNew( *this,
ptr, file, line );
}
Seems like the best place to track the proper deletion operation is in
a smart ptr. Shared_ptr and boost::intrusive_ptr can do this, if you
can modify each T. Shared_ptr is probably the choice if there are lots
of T's.
If your allocation returns a shared_ptr of a private access nested
deleter so the user has no direct access to it or the type for safety
the delete can choose the proper deleter when the shared_ptr says
its time to delete the ptr.
Exposition only not tested headers / using clauses missing for
brevity:
template <class T>
class TrackerManagerObject
{
private:
struct deleter
{
bool array;
deleter(bool a):array(a){}
void operator() (T *p)
{
if(array) delete [] p;
else delete p;
}
};
shared_ptr<T> ptr;
public:
explicit TrackerManagementObject(T *p,bool a = false)
:ptr(p,deleter(a)){}
// allow user to create a shared_ptr<T> easily
operator shared_ptr<T>() const {return ptr;}
// determine if this is array ...
bool is_array() const
{
deleter *p = get_deleter<deleter>(ptr);
assert(p); // probably not needed
return p->array;
}
// ,,,
};
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]