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

       C++中关于关键字new内存分配操作有三种形式,这三种形式各自有不同的功能:new expression、operator newplacement 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,只是负责内存申请。

     例如:

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

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

placement new

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

    例如:

void *buffer = operator new (sizeof(string));
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操作

   例如:

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

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

// new_op_new.cpp
// compile with: /EHsc
#include<new>
#include<iostream>

using namespace std;

class MyClass 
{
public: 
   MyClass( )
   {
      cout << "Construction MyClass." << this << endl;
   };

   ~MyClass( )
   {
      imember = 0; cout << "Destructing MyClass." << this << endl;
   };
   int imember;
};

int main( ) 
{
   // The first form of new delete
   MyClass* fPtr = new MyClass;
   delete fPtr;

   // The second form of new delete
   MyClass* fPtr2 = new( nothrow ) MyClass;
   delete fPtr2;

   // The third form of new delete
   char x[sizeof( MyClass )];
   MyClass* fPtr3 = new( &x[0] ) MyClass;
   fPtr3 -> ~MyClass();
   cout << "The address of x[0] is : " << ( void* )&x[0] << endl;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值