C++ 布置new 布局new placement new
new操作符(operator new)的语法
new操作符(operator new), 在头文件#include <new>
定义。
主要包括以下几类:
- 可替换的分配函数
void* operator new ( std::size_t count );
,如T* p1 = new T;
- 可替换的不抛出分配函数
void* operator new ( std::size_t count, const std::nothrow_t& tag );
- 不分配布置分配函数
void* operator new ( std::size_t count, void* ptr );
,如T* p2 = new (p1)T
- 用户定义布置分配函数
void* operator new ( std::size_t count, 用户定义实参... );
- 类特定分配函数
void* T::operator new ( std::size_t count );
- 类特定布置分配函数
void* T::operator new ( std::size_t count, 用户定义实参... );
参数 | 含义 |
---|---|
count | 要分配的字节数 |
ptr | 指向要初始化的对象所在的内存区域的指针 |
tag | 用于选择不抛出重载的消歧义标签 |
示例代码
#include <new>
#include <stdio.h>
class T {
public:
T() { printf("T::T()\n"); };
T(int n) { printf("T::T(int n)\n"); };
~T() { printf("T::~T()\n"); };
};
int main() {
T *p1 = new T; //
p1->~T();
T *p2 = new (p1) T(2); // do not delete p2
delete p1;
p1 = nullptr;
return 0;
}
执行结果
T::T()
T::~T()
T::T(int n)
T::~T()
布置new (placement new)
普通new是在堆(heap)上分配空间。
布置new(placement new)不申请空间,而是在已分配的空间上创建对象。
new/delete的过程
// new
void *ptr = malloc(sizeof(T)*1); // malloc分配空间
T* t = new(ptr)T; // 已分配空间上创建对象 - 布置new(placement new)
// delete
t->~T(); // 析构
free(ptr); // free释放空间
布置new(placement new)的注意事项
- 布置new(placement new)所使用的的空间,可以是堆(heap)空间,也可以是栈(stack)空间
- 由于布置new(placement new)并没有申请空间,在已分配空间上调用构造函数,因此需要显示调用析构函数
- 由于布置new(placement new)并没有申请空间,因此delete应该由原来分配空间的地方进行调用
License
License under CC BY-NC-ND 4.0: 署名-非商业使用-禁止演绎文章来源:https://www.toymoban.com/news/detail-684017.html
Reference:文章来源地址https://www.toymoban.com/news/detail-684017.html
- operator new - cppreference.com
- new expression - cppreference.com
- Union declaration - cppreference.com
到了这里,关于C++ 布置new 布局new placement new的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!