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?
Not exactly.
new
expression calls the correspondingoperator 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 placementvoid* operator new( std::size_t count, void* ptr)
, which does nothing and returnsptr
.It is your job to provide storage for the object being initialized when using placement new.