What is an in-place constructor in C++? [duplicate]

半腔热情 提交于 2019-11-26 18:18:16

问题


Possible Duplicate:
C++'s “placement new”

What is an in-place constructor in C++?

e.g. Datatype *x = new(y) Datatype();


回答1:


This is called the placement new operator. It allows you to supply the memory the data will be allocated in without having the new operator allocate it. For example:

Foo * f = new Foo();

The above will allocate memory for you.

void * fm = malloc(sizeof(Foo));
Foo *f = new (fm) Foo(); 

The above will use the memory allocated by the call to malloc. new will not allocate any more. You are not, however, limited to classes. You can use a placement new operator for any type you would allocate with a call to new.

A 'gotcha' for placement new is that you should not release the memory allocated by a call to the placement new operator using the delete keyword. You will destroy the object by calling the destructor directly.

f->~Foo();

After the destructor is manually called, the memory can then be freed as expected.

free(fm);



回答2:


The short answer is that your code constructs an object in the space pointed to by y. The long answer is best covered by the C++ FAQ.




回答3:


This is more commonly known as 'placement new' and is discussed pretty well by the C++ FAQ (in the 'Destructors' area):

  • http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10

It allows you to construct objects in raw memory, which can be useful in certain specialized situations, such as when you might want to allocate an array for a large number of possible objects, but want to construct then as needed because you often might not need anywhere near the maximum, or because you want or need to use a custom memory allocator.




回答4:


I'm rusty on this one but it allows you to write the object to a memory block you have already allocated. It also needs a reciprocal delete statement to clear it from memory.




回答5:


If you use a memory pool, then you need to use the in place constructor to initialize your object as they are allocated from the pool.




回答6:


It's a way to call a constructor without allocating memory. Your y has to be a pointer poniting to enough memory for a new Datatype object. Also, don't call delete, call ~DataType().



来源:https://stackoverflow.com/questions/3763846/what-is-an-in-place-constructor-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!