当前位置:  编程技术>c/c++/嵌入式

c++中new的三种用法详细解析

    来源: 互联网  发布时间:2014-10-20

    本文导语:  一. 简介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 delete(void *) throw();...

一. 简介
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 delete(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 delete(void*) throw();

(3)placement new意即“放置”,这种new允许在一块已经分配成功的内存上重新构造对象或对象数组。placement new不用担心内存分配失败,因为它根本不分配内存,它做的唯一一件事情就是调用对象的构造函数。定义如下:
    void* operator new(size_t,void*);
    void operator delete(void*,void*);

提示1:palcement new的主要用途就是反复使用一块较大的动态分配的内存来构造不同类型的对象或者他们的数组。

提示2:placement new构造起来的对象或其数组,要显示的调用他们的析构函数来销毁,千万不要使用delete。

char* p = new(nothrow) char[100];
long *q1 = new(p) long(100);
int *q2 = new(p) int[100/sizeof(int)];

二.实例

1.plain new/delete.普通的new
定义如下:
void *operator new(std::size_t) throw(std::bad_alloc);
void operator delete(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


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • new和malloc的区别深入解析
  • java命名空间java.lang枚举thread.state的类成员方法: new定义及介绍
  • 我如何将read = new BufferedReader(new InputStreamReader(serverIn));从屏幕上打印出来?
  • java命名空间javax.print.attribute.standard类multipledocumenthandling的类成员方法: single_document_new_sheet定义及介绍
  • jb中entitybean的add new finder和add new select有什么不同
  • c/c++中的内存分配 malloc 和 new介绍及相互之间的区别
  • 菜鸟问题(对象数组):对于clsA []=new claA[10];语句执行后是否已经拥有了类clsA的10个实例对象,还是要再for i=0 to 9对clsA[i]=new clsA一下?
  • CSS3 target-new 属性
  • 我是初学者,问一个比较傻的问题:既然JAVA是一种纯面向对象的语言,那么为什么int i=new int()或int i=new int(1)不能通过编译?谢谢。
  • PHP中new static()与new self()的区别异同分析
  • 有关new和delete的问题
  • Happy new Year!!!!!!!!!!!!!!!!
  • 若和知道一个对象被 new过?
  • Linux编程是否可以用new?
  • 编程语言 iis7站长之家
  • 请教各位关于 new
  • 关于new的疑惑..
  • 在new ImageIcon()中使用相对路径怎么没有用?
  • 如何得到自己被谁new了?
  • 新手提问 在线等待,为什么我的程序中 new 操作符出错?
  • 关于QT中的new和delete
  • linux 频繁new/delete 内存持续增长




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3