6
votes

This is a simple question :

Does using new operator return a pointer of type (void *)? Referring to What is the difference between new/delete and malloc/free? answer - it says new returns a fully typed pointer while malloc void *

But according to http://www.cplusplus.com/reference/new/operator%20new/

throwing (1)    
void* operator new (std::size_t size) throw (std::bad_alloc);
nothrow (2) 
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) throw();
placement (3)   
void* operator new (std::size_t size, void* ptr) throw();

which means it returns a pointer of type (void *), if it returns (void *) I have never seen a code like MyClass *ptr = (MyClass *)new MyClass;

I have got confused .

EDIT

As per http://www.cplusplus.com/reference/new/operator%20new/ example

std::cout << "1: ";
  MyClass * p1 = new MyClass;
      // allocates memory by calling: operator new (sizeof(MyClass))
      // and then constructs an object at the newly allocated space

  std::cout << "2: ";
  MyClass * p2 = new (std::nothrow) MyClass;
      // allocates memory by calling: operator new (sizeof(MyClass),std::nothrow)
      // and then constructs an object at the newly allocated space

So MyClass * p1 = new MyClass calls operator new (sizeof(MyClass)) and since throwing (1)
void* operator new (std::size_t size) throw (std::bad_alloc);
it should return (void *) if I understand the syntax correctly.

Thanks

3
@DyP Ok.. got it .. what u meant to say The new-expression (new int) uses an allocation function (operator new). The allocation function only provides storage, new-expression new type-id returns a pointer to type-id (or throws).. Thanks - Gaurav K

3 Answers

15
votes

You are confusing operator new (which does return void*) and the new operator (which returns a fully-typed pointer).

void* vptr = operator new(10); // allocates 10 bytes
int* iptr = new int(10); // allocate 1 int, and initializes it to 10
0
votes

void * does not need to be cast to a higher type during assignment only old c code from before the existence of void * requires casting as the old malloc signature returned a char * instead.

0
votes

new will return a pointer of what ever type you are making an instance of. operator new return pointer to void. new is fairly common while operator new is a little more unique.