- 相干保举
c说话new的用法先容
C说话中new有三种利用体例:plain new,nothrow new和placement new等。下面小编就和大师细说这三种用法别离是甚么。
一. 简介
(1)plain new望文生义便是通俗的new,便是咱们惯常利用的new。在C++中是如许界说的:
void* operator new(std::size_t) throw(std::bad_alloc);
void operator (void *) throw();
提醒:plain new在分派失利的环境下,抛出非常std::bad_alloc而不是前往NULL,是以经由过程判定前往值是不是为NULL是白费的。
(2)nothrow new是不抛出非常的运算符new的情势。nothrow new在失利时,前往NULL。界说以下:
void * operator new(std::size_t,const std::nothrow_t&) throw();
void operator (void*) throw();
(3)placement new意即“安排”,这类new许可在一块已分派胜利的内存上从头机关工具或工具数组。placement new不用担忧内存分派失利,由于它底子不分派内存,它做的独一一件工作便是挪用工具的机关函数。界说以下:
void* operator new(size_t,void*);
void operator (void*,void*);
提醒1:palcement new的首要用处便是频频利用一块较大的静态分派的内存来机关差别范例的工具或他们的数组。
提醒2:placement new机关起来的工具或其数组,要显现的挪用他们的析构函数来烧毁,万万不要利用。
char* p = new(nothrow) char[100];
long *q1 = new(p) long(100);
int *q2 = new(p) int[100/sizeof(int)];
二.实例
1.plain new/.通俗的new
界说以下:
void *operator new(std::size_t) throw(std::bad_alloc);
void operator (void*) throw();
注:规范C++ plain new失利后抛出规范非常std::bad_alloc而非前往NULL,是以查抄前往值是不是为NULL判定分派是不是胜利是白费的。
测试法式:
复制代码 代码以下:
#include "stdafx.h"
#include
using namespace std;
char *GetMemory(unsigned long size)
{
char *p=new char[size];//分派失利,不是前往NULL
return p;
}
int main()
{
try
{
char *p=GetMemory(10e11);// 分派失利抛出非常std::bad_alloc
//...........
if(!p)//白费
cout<<"failure"<<endl;
[] p;
}
catch(const std::bad_alloc &ex)
{
cout<<ex.what()<<endl;
}
return 0;
}
2.nothrow new/不抛出非常的运算符new的情势,new失利时前往NULL。
界说以下:
复制代码 代码以下:
void *operator new(std::size_t,const std::nothrow_t&) throw();
void operator (void*) throw();
struct nothrow_t{}; const nothrow_t nothrow;//nothrow作为new的标记性哑元
测试法式:
复制代码 代码以下:
#include "stdafx.h"
#include
#include
using namespace std;
char *GetMemory(unsigned long size)
{
char *p=new(nothrow) char[size];//分派失利,是前往NULL
if(NULL==p)
cout<<"alloc failure!"<<endl;
return p;
}
int main()
{
try
{
char *p=GetMemory(10e11);
//...........
if(p==NULL)
cout<<"failure"<<endl;
[] p;
}
catch(const std::bad_alloc &ex)
{
cout<<ex.what()<<endl;
}
return 0;
}
3.placement new/ 首要用处是:频频利用一块较大的静态分派胜利的内存来机关差别范例的工具或它们的数组。比方能够先请求一个充足大的字符数组,而后当须要时在它下面机关差别范例的工具或数组。placement new不用担忧内存分派失利,由于它底子不分派内存,它只是挪用工具的机关函数。
测试法式:
复制代码 代码以下:
#include "stdafx.h"
#include
#include
using namespace std;
class ADT
{
int i;
int j;
public:
ADT()
{
}
~ADT()
{
}
};
int main()
{
char *p=new(nothrow) char[sizeof(ADT)+2];
if(p==NULL)
cout<<"failure"<<endl;
ADT *q=new(p) ADT; //placement new:不用担忧失利
// q;//毛病!不能在此处挪用 q;
q->ADT::~ADT();//显现挪用析构函数
[]p;
return 0;
}
注:利用placement new机关起来的工具或数组,要显式挪用它们的析构函数来烧毁(析构函数并不开释工具的内存),万万不要利用.这是由于placement new机关起来的工具或数组巨细并不必然即是本来分派的内存巨细,利用会形成内存泄露或以后开释内存时呈现运转时毛病。
【c说话new的用法先容】相干文章:
C说话assert用法06-24
C说话#include用法10-17
C说话#define的用法08-19
c说话if语句的用法07-23
assert用法(C说话)05-30
C说话assert的用法10-29
C说话for语句用法详解10-30
c说话中bit的用法11-01
C说话for语句的用法实例07-08
c说话问号冒号的用法09-01