C++ Placement new 和构造函数调用
C++ Placement new and Constructor call
我正在通过以下代码学习新的 C++ 布局。
class Cell {
public:
Cell() {
printf("default constructor by %s\n", __func__);
}
Cell(int ina) : a(ina) {
printf("customized constructor.\n");
}
~Cell() {}
void* operator new(size_t); // Operator new.
void* operator new(size_t, Cell*p) {
return p;
}
private:
int a; // tmp variable.
};
// Global variable.
Cell global_cell;
void* Cell::operator new(size_t size) {
printf("start running the placement new\n");
Cell* ptr = new (&global_cell) Cell;
printf("the cell pointer is %p and the global address is %p\n", ptr, &global_cell);
return ptr;
}
int main() {
printf("====\n");
Cell *ptr = new Cell;
printf("====\n");
}
这是我得到的输出:
default constructor by Cell
=====
start running the placement new
default constructor by Cell
the cell pointer is 0x60107c and the global address is 0x60107c
default constructor by Cell
=====
我知道第一个"default constructor"来自global_cell
的点化。但是为什么在那之后我得到了两个 "default constructor" ?我是否遗漏了有关新展示位置的信息?另外,我如何使用第二个接受输入整数的非默认构造函数来实现新的放置?
new (&global_cell) Cell
在您的 operator new
重载中是一个默认构造,new Cell
在 main
中是另一个。
operator new
只应该分配内存,而不是构造对象;之后会自动调用相关的构造函数。
将 placement new 与非默认构造函数一起使用并不是很复杂:
new (&global_cell) Cell(2)
(即与"regular"new
没有区别。)
当你打电话时你会得到它们 "new Cell":
Cell *ptr = new Cell;
Cell* ptr = new (&global_cell) Cell;
调用operator new后,总是调用constructor
您以错误的方式为 class 实现自定义 operator new
。
operator new
对于 class 应该只提供放置实例的原始内存,而不是创建对象。 Placement new 而是初始化一个对象(在你的情况下使用默认构造函数,因为你没有指定参数)。
如果你想使用 placement new 和传递参数只写
new (memory_address) MyObject(arg1, arg2);
但请注意,使用 placement new 是为 class 定义自定义 operator new
的 替代方法 。在后者中,您只需使用
调用正常分配
new MyObject(arg1, arg2);
使用您的自定义分配器(但是应该只提供足够且正确对齐的内存)。
我正在通过以下代码学习新的 C++ 布局。
class Cell {
public:
Cell() {
printf("default constructor by %s\n", __func__);
}
Cell(int ina) : a(ina) {
printf("customized constructor.\n");
}
~Cell() {}
void* operator new(size_t); // Operator new.
void* operator new(size_t, Cell*p) {
return p;
}
private:
int a; // tmp variable.
};
// Global variable.
Cell global_cell;
void* Cell::operator new(size_t size) {
printf("start running the placement new\n");
Cell* ptr = new (&global_cell) Cell;
printf("the cell pointer is %p and the global address is %p\n", ptr, &global_cell);
return ptr;
}
int main() {
printf("====\n");
Cell *ptr = new Cell;
printf("====\n");
}
这是我得到的输出:
default constructor by Cell
=====
start running the placement new
default constructor by Cell
the cell pointer is 0x60107c and the global address is 0x60107c
default constructor by Cell
=====
我知道第一个"default constructor"来自global_cell
的点化。但是为什么在那之后我得到了两个 "default constructor" ?我是否遗漏了有关新展示位置的信息?另外,我如何使用第二个接受输入整数的非默认构造函数来实现新的放置?
new (&global_cell) Cell
在您的 operator new
重载中是一个默认构造,new Cell
在 main
中是另一个。
operator new
只应该分配内存,而不是构造对象;之后会自动调用相关的构造函数。
将 placement new 与非默认构造函数一起使用并不是很复杂:
new (&global_cell) Cell(2)
(即与"regular"new
没有区别。)
当你打电话时你会得到它们 "new Cell":
Cell *ptr = new Cell;
Cell* ptr = new (&global_cell) Cell;
调用operator new后,总是调用constructor
您以错误的方式为 class 实现自定义 operator new
。
operator new
对于 class 应该只提供放置实例的原始内存,而不是创建对象。 Placement new 而是初始化一个对象(在你的情况下使用默认构造函数,因为你没有指定参数)。
如果你想使用 placement new 和传递参数只写
new (memory_address) MyObject(arg1, arg2);
但请注意,使用 placement new 是为 class 定义自定义 operator new
的 替代方法 。在后者中,您只需使用
new MyObject(arg1, arg2);
使用您的自定义分配器(但是应该只提供足够且正确对齐的内存)。