1.placement new 操作符可以在一块内存上面调用构造函数去构造一个对象。
2.operator new 操作符可以申请一块内存,返回该内存的指针void*。

  通过这两个操作符的结合使用,可以延迟对象的构造,也可以避免重复的申请释放内存,而在一块内存上面不断地进行对象的构造析构,从而提高效率,并且减少了内存碎片的产生。

  接下来举个例子,首先使用 operator new申请出一块Student大小的内存,然后再该内存上面不断地进行构造,析构,构造出的新对象调用函数PringName()打印当前学生的名字。最后使用operator delete释放该内存。

#include <iostream>
#include <string>

class Student {
public:
  Student()
      : name_("Default") {
    std::cout << "Construct!" << std::endl;
  }

  Student(const std::string& name)
      : name_(name) {
    std::cout << "Construct!" << std::endl;
  }

  void PrintName() const {
    std::cout << name_ << std::endl;
  }

  ~Student() {
    std::cout << "Deconstruct!" << std::endl;
  }

private:
  std::string name_;
};

int main() {
  // 使用 operator new申请一块内存。
  Student* s = static_cast<Student*>(operator new(sizeof(Student)));

  // 使用placement new在该内存上面调用构造函数。
  new (s)Student;
  s->PrintName();

  // 析构该对象。
  s->~Student();

  std::cout << std::endl;

  for (std::size_t i = 0; i < 5; ++i) {
    std::string name = "Name" + std::to_string(i);

    // 使用placement new在该内存上面调用构造函数。
    new (s)Student(name);

    s->PrintName();
    s->~Student();

    std::cout << std::endl;
  }

  // 最后释放该内存。
  operator delete (s);

  return 0;
}


输出结果:
C++ placement new 操作符_操作符