#include <iostream>
#include <stdlib.h>
using namespace std;
class X
{
public:
X(bool const throwing = false)
{
if (throwing)
throw 1;
}
void *operator new(size_t n)
{
cout << endl;
cout << "operator new(" << n
<< ")" << endl;
return malloc(n);
}
void *operator new(size_t n1, size_t n2)
{
cout << endl;
cout << "operator new(" << n1
<< ", " << n2 << ")" << endl;
return malloc(n1);
}
void operator delete(void *p, size_t n)
{
cout << "operator delete(" << n
<< ")" << endl;
free(p);
}
private:
// makes sizeof(X) predictable
char space[100];
};
int main()
{
X *x;
//
// test 1: non-placement, no throw
//
x = new X;
delete x;
//
// test 2: placement, no throw
//
x = new(2) X;
delete x;
try
{
//
// test 3: non-placement, throw
//
x = new X(true);
}
catch (...)
{
cout << "catch" << endl;
}
try
{
//
// test 4: placement, throw
//
x = new(4) X(true);
}
catch (...)
{
cout << "catch" << endl;
}
return 0;
}
/* correct output:
operator new(100)
operator delete(100)
operator new(100, 2)
operator delete(100)
operator new(100)
operator delete(100)
catch
operator new(100, 4)
operator delete(4)
catch
*/
End of Listing