C++学习之New关键字的内部理解

new 内部所做的事
获得一块内存空间、调用构造函数、返回正确的指针

A* pa = (A*)malloc(sizeof(A));
//

pa->A::A(3);

return pa;

1.首先会去申请一块内存,当申请失败时候new_handler函数

new_handle 返回只有三种情况
1.1 分配内存成功
1.2 new_handler中抛出bad_alloc异常 //默认情况下都是这个
1.3 new_handler中调用exit()或类似的函数,使程序结束


new 的三种用法:
1.plain new/delete.普通的new

char *p=new char[size];
if(!p)//徒劳
   cout<<"failure"<<endl;
  delete [] p;

2.nothrow new/delete不抛出异常的运算符new的形式,new失败时返回NULL
try
{
  char *p=GetMemory(10e11);
  //...........
  if(p==NULL)
   cout<<"failure"<<endl;
  delete [] p;
}
3.placement new/delete 主要用途是:反复使用一块较大的动态分配成功的内存来构造不同类型的对象或者它们的数组。例如可以先申请一个足够大的字符数组,然后当需要时在它上面构造不同类型的对象或数组。placement new不用担心内存分配失败,因为它根本不分配内存,它只是调用对象的构造函数
char *p=new(nothrow) char[sizeof(ADT)+2];
if(p==NULL)
  cout<<"failure"<<endl;

ADT *q=new(p) ADT;  //placement new:不必担心失败
// delete q;//错误!不能在此处调用delete q;
q->ADT::~ADT();//显示调用析构函数
delete []p;

猜你喜欢

转载自www.cnblogs.com/xlsss159/p/10361053.html