avr-libc-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [avr-libc-dev] adding wrapper functions for new and delete operators


From: Bob Paddock
Subject: Re: [avr-libc-dev] adding wrapper functions for new and delete operators
Date: Sun, 13 Feb 2011 06:21:07 -0500

> am open to suggestions on what to try.

Ned Konz posted this in June of 2006, see the list archives:

Something like this (I added set_new_handler()) should work (this is a
modified version of the libstdc++ code, with all the exception-related
stuff pulled out):


// avr-gcc -Os -g -Wa,-ahlds=newDelete.lst -fno-exceptions -c newDelete.cpp

extern "C++" {
namespace std
{
 typedef unsigned int size_t;
 typedef void (*new_handler)();
 new_handler set_new_handler(new_handler) throw();
}

void operator delete(void*) throw();
void operator delete[](void*) throw();
void* operator new(std::size_t) throw();
void* operator new[](std::size_t) throw();
void operator delete(void*) throw();
void operator delete[](void*) throw();
// Default placement versions of operator new.
inline void* operator new(std::size_t, void* __p) throw() { return __p; }
inline void* operator new[](std::size_t, void* __p) throw() { return __p; }
// Default placement versions of operator delete.
inline void  operator delete  (void*, void*) throw() { }
inline void  operator delete[](void*, void*) throw() { }
}

// --- implementation ---
//

using std::new_handler;
extern "C" void *malloc (std::size_t);
extern "C" void free(void *);
extern void abort() __attribute__((noreturn));
new_handler __new_handler;

void *
operator new (std::size_t sz) throw()
{
   void *p;
   if (sz == 0)
       sz = 1;
   p = (void*) malloc(sz);

   while (p == 0)
   {
       new_handler handler = __new_handler;
       if (! handler)
           return 0;
       handler();
       p = (void *) malloc(sz);
   }

   return p;
}

void*
operator new[] (std::size_t sz) throw()
{
 return ::operator new(sz);
}

void
operator delete (void *ptr) throw ()
{
 if (ptr)
   free (ptr);
}

void
operator delete[] (void *ptr) throw ()
{
 ::operator delete (ptr);

}

void __cxa_pure_virtual()
{
   abort();
}

// Example:

class KMyClass
{
  private:
     int *Array;
     int Len;
  public:
     KMyClass(int len) : Len(len), Array(new int[len]) { }
     ~KMyClass() { delete [] Array; }
     int& operator[] (int i) { return Array[i]; }
};

KMyClass *someFunc(int i)
{
  KMyClass *var = new KMyClass(i);
  return var;
}

void someOtherFunc(KMyClass *kmc)
{
   delete kmc;

}



reply via email to

[Prev in Thread] Current Thread [Next in Thread]