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! ]