C ++ Placement new和Constructor调用

时间:2015-12-15 23:37:14

标签: c++ operator-keyword allocator

我正在通过以下代码学习新的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
=====

我知道第一个“默认构造函数”来自global_cell的启动。但为什么我之后会得到两个“默认构造函数”呢?我错过了关于新位置的内容吗?另外,如何使用带有输入整数的第二个非默认构造函数实现placement new?

3 个答案:

答案 0 :(得分:2)

new (&global_cell) Cell
operator new重载中的

是一个默认构造,new Cell中的main是另一个。

operator new只应该分配内存,而不是构造一个对象;之后会自动调用相关的构造函数。

在非默认构造函数中使用placement new并不是很复杂:

new (&global_cell) Cell(2)

(也就是说,“常规”new没有区别。)

答案 1 :(得分:0)

当你打电话给“新单元格”时,你会得到它们:

Cell *ptr = new Cell;
Cell* ptr = new (&global_cell) Cell;

调用operator new后,总是调用构造函数

答案 2 :(得分:0)

您以错误的方式为该课程实施自定义operator new

对于类,

operator new应该只提供原始内存放置实例的位置,而不是创建对象。 Placement new会初始化一个对象(在您的情况下使用默认构造函数,因为您没有指定任何参数)。

如果你想使用placement new和传递参数,只需写

new (memory_address) MyObject(arg1, arg2);

但请注意,使用placement new是一种替代,用于为类定义自定义operator new。在后者中,您只需使用

调用正常分配
new MyObject(arg1, arg2);

使用自定义分配器(但是应该只提供足够且正确对齐的内存)。