placement new(c++new的用法是怎么样的)
本文目录
c++new的用法是怎么样的
new有三种使用方式:plain new,nothrow new和placement new。
1、plain new,是普通的new,其功能主要是完成对象的初始化。定义如下:
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,这种new允许在一块已经分配成功的内存上重新构造对象或对象数组。placement new不用担心内存分配失败,因为它根本不分配内存,它做的唯一一件事情就是调用对象的构造函数。定义如下:
void* operator new(size_t,void*);
void operator delete(void*,void*);
使用方式:
placement new既可以在栈(stack)上生成对象,也可以在堆(heap)上生成对象。不用担心内存分配失败,因为它根本不分配内存,它只是调用对象的构造函数。
使用placement new构造起来的对象或数组,要显式调用它们的析构函数来销毁(析构函数并不释放对象的内存),不能使用delete.这是因为placement new构造起来的对象或数组大小并不一定等于原来分配的内存大小,使用delete会造成内存泄漏或者之后释放内存时出现运行时错误。
如何在重载new时 区分普通new 和 placement new
placement new是operator new的重载版本,不重新分配内存,而是直接使用已有的内存,在这个内存中构造对象。POINTER = new (ACE_nothrow) CONSTRUCTOR;//在ACE_nothrow指向的内存空间上构造CONSTRUCTOR。
更多文章:
仙剑奇侠传5激活码能用几次(仙剑5激活码,在官网看到说是可以激活2台电脑,台式和笔记本)
2023年8月22日 22:40
芭比娃娃小游戏(求一个芭比娃娃设计衣服的游戏,1999年玩的,不是小游戏,是光碟版)
2024年2月7日 12:20
俄罗斯方块消消消正版下载(玩俄罗斯方块消消消时广告怎么消除)
2024年7月25日 15:30
易采工程设备物资采购平台官网大于100M的文件如何处理?企业级采购平台哪个好易采办怎么样推荐几个靠谱点的
2024年7月2日 16:48
新浪微博怎么发长微博图片?新浪微博长微博怎么发找不到这个选项了
2024年6月3日 02:36
腾讯一键root工具(如何利用腾讯Android一键Root获取手机权限)
2024年7月8日 12:19
英雄连2:阿登突击和英雄连2:西线军团有什么区别?英雄连2正版如何汉化
2024年6月27日 14:07
玩dnf的玩家到腾讯公司dnf部门上班是一种怎样的体验?在腾讯工作是一种什么样的体验
2024年7月4日 07:04