内存分配:new的三种方法-new expression、operator new和placement new

悠悠 2022-08-12 00:24 359阅读 0赞

C++中关于关键字new内存分配操作有三种形式,这三种形式各自有不同的功能:new expression、operator new和placement new;下面分别介绍;

new expression

new expression所谓的new表达式就是我们平常所见new,new expression的操作包含两个步骤:

  1. 分配内存;
  2. 调用构造函数构造对象,必要时对其初始化;

    例如:

    string * str = new string(“ABC”);

    这个语句的实现需经过以下两个步骤:(1)一般调用operator new分配足够的内存;(2)调用string类的构造函数构造对象,并对其初始化为ABC;

operator new

operator new平常叫做new操作符,该操作符仅仅完成内存的分配,并不对其构造对象或初始化;类似于C语言的malloc,只是负责内存申请。

例如:

  1. void *buffer = operator new (sizeof(string));

这里只是申请内存,并没有构造对象或初始化。

placement new

placement new是用来在指定的地址(已分配好的内存)上构造对象,并不对其分配内存;

例如:

  1. void *buffer = operator new (sizeof(string));
  2. buffer = new (buffer) string("ABC");

这里的语句,首先是先分配内存,然后使用 placement new在已分配好的内存上构造对象,并对其初始化。由placement new创建的对象,如果使用delete时,该对象对应的内存也被释放,所以,若你只想删除该对象不保存内存的话,就必要显示调用析构函数。
谈到new时,这里也必须谈下delete的用法,但是delete只有两种形式:delete expression和operator delete

delete expression

delete expression操作是与new expression相对应的,也就是我们常见的delete,它也需要两个步骤来实现:

  1. 析构对象;
  2. 释放内存;

    例如:

    string *str = new string(“ABC”);
    delete str;

这里的 delete 执行的过程,首先是析构对象,再释放内存;

operator delete

operator delete操作只是内存的释放,不够析构对象,类似于C语言的free操作。

例如:

  1. void *buffer = operator new (sizeof(string));
  2. operator delete (buffer);

下面给出的是 C++ 库文件的一个例子 :

  1. // new_op_new.cpp
  2. // compile with: /EHsc
  3. #include<new>
  4. #include<iostream>
  5. using namespace std;
  6. class MyClass
  7. {
  8. public:
  9. MyClass( )
  10. {
  11. cout << "Construction MyClass." << this << endl;
  12. };
  13. ~MyClass( )
  14. {
  15. imember = 0; cout << "Destructing MyClass." << this << endl;
  16. };
  17. int imember;
  18. };
  19. int main( )
  20. {
  21. // The first form of new delete
  22. MyClass* fPtr = new MyClass;
  23. delete fPtr;
  24. // The second form of new delete
  25. MyClass* fPtr2 = new( nothrow ) MyClass;
  26. delete fPtr2;
  27. // The third form of new delete
  28. char x[sizeof( MyClass )];
  29. MyClass* fPtr3 = new( &x[0] ) MyClass;
  30. fPtr3 -> ~MyClass();
  31. cout << "The address of x[0] is : " << ( void* )&x[0] << endl;
  32. }

发表评论

表情:
评论列表 (有 0 条评论,359人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Placement New

    首先我们区分下几个容易混淆的关键词:new、operator new、placement new new和delete操作符我们应该都用过,它们是对堆中的内存进行申请和释放,

    相关 New Year, New Me

    新的一年,新的开始 2017年,是我的毕业年,也是我开始参加工作的一年,这一年,很忙碌,很充实,却也很累,但也在一一实现着17年的计划,直到今日,十之八九得到了一个圆满的