#include <iostream>
#include <cstdlib>
#include <new>
using namespace std;
class loc {
                 int longitude, latitude;
                 loc() {}
                 loc(int lg, int lt) {
                 longitude = lg;
                 latitude = lt;

void show() {
                cout << longitude << " ";
                cout << latitude << "\n";
// Global new
void *operator new(size_t size)
                void *p;
                p = malloc(size);
                if(!p) {
                                   bad_alloc ba;
                                   throw ba;
                return p;
// Global delete
void operator delete(void *p)

int main()
                  loc *p1, *p2;
                  float *f;
                  try {
                              p1 = new loc (10, 20);
                  } catch (bad_alloc xa) {
                              cout << "Allocation error for p1.\n";
                              return 1;;
                  try {
                              p2 = new loc (-10, -20);
                  } catch (bad_alloc xa) {
                              cout << "Allocation error for p2.\n";
                              return 1;;
                  try {
                             f = new float; // uses overloaded new, too
                  } catch (bad_alloc xa) {
                             cout << "Allocation error for f.\n";
                             return 1;;
                  *f = 10.10F;
                  cout << *f << "\n";
                  delete p1;
                  delete p2;
                  delete f;
                  return 0;

I am not completely sure how this mechanism works. Particularly the new operator function works on void* p defined within its body and no parameter to the target class type is passed to the operator function, so how is the constructor to target type is passed the parameters (ie 10, 20)? It seems like magic.

One other thing, when the new operator is called in main, we did not call, sizeof. But for typical situation when malloc is involved we do something like this:

int* p = (int*) malloc(5*sizeof(int));

if we don't use sizeof then only 5 bytes are allocated instead of 5*4(say int is of 4 bytes).

This seems also mysterious.

Does someone care to explain?


Edited by johndoe444: n/a

Votes + Comments
good question and good post.
8 Years
Discussion Span
Last Post by r.stiltskin

f = new float; is normal syntax for the built-in new operator. It has nothing to do with your overloaded new, as you can see if you comment-out that definition. new float allocates memory for a float and returns a pointer to it. It needs no size parameter because the compiler already knows how much memory a float (or an int, or a double, etc) requires.

Edited by r.stiltskin: n/a

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.