[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;
}