Dave wrote:
Hello all,
I'd like to find a source on the web that discusses, in a comprehensive
manner and in one place, everything about new / delete. It should include
overloading operator new, the new operator, placement, nothrow, arrays,
etc...
My books cover the topic, I've found FAQs on the web that cover the topic,
and so on, but all the sources I've found are disjointed. There's a bit on
this page, a bit on that page, and so on. The information may all be there,
but it's kind of hard to piece it all together.
If anybody knows of an article out there that gives a comprehensive
treatment of this topic in one place, I'd appreciate a link.
I don't know of one but let's see if we can make one !
http://www.google.com/search?q=new+d....parashift.com
That will give you a fairly detailed treatment of the topic.
The code below covers most of the new/delete usages I have used.
------------------------------------------------------------------------
#include <unistd.h>
#include <cstring>
// non-portable but non-allocating write method
void Write( const char * l_str )
{
::write( 1, l_str, std::strlen( l_str ) );
::write( 1, "\n", 1 );
}
#include <new>
#include <cstdlib>
inline void * operator new ( size_t i_val )
{
Write( "new called" );
void * l_ptr = std::malloc( i_val );
return l_ptr;
}
inline void operator delete ( void * i_ptr )
{
Write( "delete called" );
if ( i_ptr )
{
std::free( i_ptr );
}
}
struct A
{
A()
{
Write( "A contructed" );
}
~A()
{
Write( "A destructed" );
}
};
template <typename X>
void test1()
{
X * l_a = new X;
delete l_a;
X * l_b = new X[3];
delete [] l_b;
}
// This does not seem to be called - no matter what
inline void operator delete ( void * i_ptr, size_t i_val )
{
Write( "delete (with size) called" );
if ( i_ptr )
{
std::free( i_ptr );
}
}
template <typename X>
void test2()
{
X * l_a = new X;
delete l_a;
X * l_b = new X[3];
delete [] l_b;
}
struct B
{
inline void * operator new ( size_t i_val )
{
Write( "B::new called" );
void * l_ptr = std::malloc( i_val );
return l_ptr;
}
inline void operator delete ( void * i_ptr )
{
Write( "B::delete (with size) called" );
if ( i_ptr )
{
std::free( i_ptr );
}
}
B()
{
Write( "B contructed" );
}
~B()
{
Write( "B destructed" );
}
};
struct C
{
inline void * operator new ( size_t i_val )
{
Write( "C::new called" );
void * l_ptr = std::malloc( i_val );
return l_ptr;
}
inline void * operator new ( size_t i_val, void * i_ptr )
{
Write( "C::new placement new called" );
return i_ptr;
}
inline void operator delete ( void * i_ptr, size_t i_val )
{
Write( "C::delete (with size) called" );
if ( i_ptr )
{
std::free( i_ptr );
}
}
C()
{
Write( "C contructed" );
}
~C()
{
Write( "C destructed" );
}
};
template <typename X>
void test3()
{
long x[ ( sizeof( long ) + sizeof( X ) -1 )/sizeof( long ) ];
X * l_x = new ( ( void * ) x ) X;
l_x->~X();
}
int main()
{
Write( "\ntest1<A>" );
test1<A>();
Write( "\ntest2<A>" );
test2<A>();
Write( "\ntest1<B>" );
test1<B>();
Write( "\ntest1<C>" );
test1<C>();
Write( "\ntest3<A>" );
test3<A>();
Write( "\ntest3<C>" );
test3<C>();
}
-------- output ----------
../new_del
test1<A>
new called
A contructed
A destructed
delete called
new called
A contructed
A contructed
A contructed
A destructed
A destructed
A destructed
delete called
test2<A>
new called
A contructed
A destructed
delete called
new called
A contructed
A contructed
A contructed
A destructed
A destructed
A destructed
delete called
test1<B>
B::new called
B contructed
B destructed
B::delete (with size) called
new called
B contructed
B contructed
B contructed
B destructed
B destructed
B destructed
delete called
test1<C>
C::new called
C contructed
C destructed
C::delete (with size) called
new called
C contructed
C contructed
C contructed
C destructed
C destructed
C destructed
delete called
test3<A>
A contructed
A destructed
test3<C>
C::new placement new called
C contructed
C destructed