美文网首页
C++中new、operator new和placement n

C++中new、operator new和placement n

作者: Mr_约科 | 来源:发表于2019-10-10 14:58 被阅读0次

1. new

(1)C++对象实例化的时候使用new关键字和不使用new关键字的区别
  • 使用new是动态分配内存,这个分配的是堆的内存,需要自己手动释放,即通过delete释放;而不使用new的对象在栈的空间中,在当前作用结束后自动回收。
  • new创建出的对象需要使用指针接收。
(2)new之后,编译器做了哪些事情
Temp* t = new Temp();
  • 调用operatr new 分配内存,大小为Temp对象所占内存大小
  • 调用构造函数生成类对象
  • 返回相应指针

因此在C++中使用new关键字相当于先申请内存后执行构造函数;使用delete相当于先执行析构函数后释放内存。

2. operator new

3. placement new

(1)使用背景

如果多次都需要申请一块类似的内存,然后去释放。而每一次内存的申请,系统都需要在在堆中找到一块合适大小的内存空间,这个操作速度是很慢的,极端情况下,如果当前系统有大量的内存碎片,并且我们申请的空间很大,有可能出现无法分配内存的异常(空间不够)。
当我们觉得默认的new operator 对内存的管理不能满足我们的需要,而想自己手动管理内存时,就使用placement new,来公用一块我们事先准备好的内存。

placement new 的作用就是:创建对象(调用该类的构造函数)但是不分配内存,而是在已有的内存块上面创建对象。

(2)使用方法

在使用new关键字建里一个新对象的时候,在编译器的第二步就是调用对象的构造函数生成类对象。这一步使用的就是placement new来实现的,即在取得了一块可以容纳指定对象的内存之后,在这块内存上构造一个对象,省略中间多次分配内存

类名* 对象名 = new(已有的内存空间指针) 类名;

例如

class Person
{

};

int main()
{
  void* memory = malloc(sizeof(Person));//申请内存空间
  cout << memory << endl;
  Person* p = new(memory) Person;//创建对象,调用构造函数
  cout << p <<endl;
  delete p;//销毁对象
  return 0;
}

相关文章

网友评论

      本文标题:C++中new、operator new和placement n

      本文链接:https://www.haomeiwen.com/subject/bptxpctx.html