C++ placement new 操作符

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;
}


输出结果:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值