I've been reading some questions about placement new on SO and I am finding some different ways to use it that I thought I would ask about here. I understand that placement new is basically a way for you to create an object and give it a certain place in memory of your choice that has already been allocated; I just don't understand all of the intricacies.
First one I saw on SO uses this example (from C++ Primer):
const int BUF = 512;
const int N = 5;
char buffer[BUF];
double * pd1;
pd1 = new (buffer) double[N];
Second one I saw on SO uses this example (from C++ Primer Plus):
char * buffer = new char[BUF]; //get a block of memory
JustTesting *pc1, *pc2;
pc1 = new (buffer) JustTesting; //Place object in buffer
The main difference between these two is that in the first block of code, buffer
is a char array and in the second example it is a pointer to a char array, yet both blocks of code contain new (buffer)
.
My first question is: When using placement new in this context, can it accept either an object or it's address, and if so, is one preferred?
I've also seen placement new used without an lvalue. See below.
new(&myObject) myClass;
My second question is: What are the differences between placement new with vs. without an lvalue?
I understand that placement new is basically a way for you to create an object and give it a certain place in memory of your choice that has already been allocated;
Not exactly.
new
expression calls the corresponding operator new
and then invokes the constructor. Note that these are two different things named similarly.
Placement new
expression skips allocating memory and only invokes the constructor. This is achieved by using the placement void* operator new( std::size_t count, void* ptr)
, which does nothing and returns ptr
.
It is your job to provide storage for the object being initialized when using placement new.