I am trying to figure out the C++ memory allocation mechanism. I understand the difference between operator new()
and the new
expression.
But as I found here, the prototypes of operator new()
and operator new[]()
are almost identical, and the default implementations of operator new[]()
should simply invoke the corresponding version of operator new()
.
My questions are:
- If we can simply use
operator new()
functions to allocate any size of memory and use the memory as an array, what is the purpose ofoperator new[]()
? I tried this piece of code:
struct MyClass { MyClass() { cout << this << "::MyClass()" << endl;} ~MyClass() { cout << this << "::~MyClass()" << endl;} }; int main() { MyClass *ptr = (MyClass *)::operator new[]( sizeof( MyClass) * 3); new (ptr) MyClass; new (ptr+1) MyClass; new (ptr+2) MyClass; delete[] ptr; return 0; }
It printed out following messages before it crashed:
0x562ecf758e70::MyClass() 0x562ecf758e71::MyClass() 0x562ecf758e72::MyClass() 0x562ecf758e90::~MyClass() 0x562ecf758e8f::~MyClass() 0x562ecf758e8e::~MyClass() 0x562ecf758e8d::~MyClass() 0x562ecf758e8c::~MyClass() 0x562ecf758e8b::~MyClass() 0x562ecf758e8a::~MyClass() 0x562ecf758e89::~MyClass() 0x562ecf758e88::~MyClass() 0x562ecf758e87::~MyClass() 0x562ecf758e86::~MyClass() 0x562ecf758e85::~MyClass() 0x562ecf758e84::~MyClass() 0x562ecf758e83::~MyClass() 0x562ecf758e82::~MyClass() 0x562ecf758e81::~MyClass() 0x562ecf758e80::~MyClass() 0x562ecf758e7f::~MyClass() 0x562ecf758e7e::~MyClass() 0x562ecf758e7d::~MyClass() 0x562ecf758e7c::~MyClass() 0x562ecf758e7b::~MyClass() 0x562ecf758e7a::~MyClass() 0x562ecf758e79::~MyClass() 0x562ecf758e78::~MyClass() 0x562ecf758e77::~MyClass() 0x562ecf758e76::~MyClass() 0x562ecf758e75::~MyClass() 0x562ecf758e74::~MyClass() 0x562ecf758e73::~MyClass() 0x562ecf758e72::~MyClass() 0x562ecf758e71::~MyClass() 0x562ecf758e70::~MyClass() *** Error in `/home/alec/.cpp-run/1/a.out': free(): invalid pointer: 0x0000562ecf758e68 ***
Why did
delete[]
try to destruct 30 objects which didn't exist and was out of the memory allocated byoperator new[]()
? Also, why did it crash?