C++中的new用法总结
前段时间复习面试的时候,看到这个问题经常有问到,我这个小白就看了些博客和书,总结一下。
new可以说是个一个关键字,也可以说是一个运算符,并且可以被重载。
1、new operator
这个就是平时最经常用的new,用法如下程序所示:
class A
{
public:
A(int i) :a(i){}
private:
int a;
}; int main()
{
A* example = new A();
}
new operator实际上执行了以下三个步骤:
1、调用operator new分配内存(后面要说的第二种new),如果类本身定义了operator new,那么会调用类自己的operator new,而不是全局的;
2、调用A的构造函数A::A(int);
3、返回相应的指针
2、operator new
operator new不调用构造函数,而仅仅分配内存,有两个版本,前者抛出异常,后者当失败时不抛出异常,而是直接返回:
void* operator new (std::size_t size);
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) noexcept;
可以看到,operator new的作用有点类似与C语言中的malloc,有的地方说operator new的底层实现可以是malloc。
C++中可以用set_new_handler()设置抛出bad_alloc()异常时调用的处理函数,<<Effective C++>>有几个条款很详细描述了具体做法。
我还是太菜了,水平不够,不太能理解自定义异常处理函数的内容...T T
class A
{
public:
A(int i) :a(i){}
void* operator new(size_t size)
{
cout << "call A::operator new" << endl;
return malloc(size);
}
void operator delete(void* p)
{
cout << "call A::operator delete" << endl;
return free(p);
}
void* operator new(size_t size, const nothrow_t& nothrow_value) noexcept
{
cout << "call A::operator new (noexcept)" << endl;
return malloc(size);
}
void operator delete(void* p, const nothrow_t& nothrow_value) noexcept
{
cout << "call A::operator delete (noexcept)" << endl;
free(p);
}
private:
int a;
}; int main()
{
A* example1 = new A();
delete example1;
A* example2 = new(nothrow) A();
delete example2;
}
用一个小例子可以证明一下,确实调用的是自定义operator new/delete,而不是全局的。
3、placement new
placement new仅在一个已经分配好的内存指针上调用构造函数,基本形式如下:
void* operator new (std::size_t size, void* ptr) noexcept;
placement new不需要抛出异常,因为它自身不分配内存。
同时,ptr指针是已经分配好的,可能在栈上也可能在堆上,如下面的例子:
class A
{
public:
A(int i) :a(i){}
int getValue(){ return a; }
private:
int a;
}; int main()
{
A* p1 = new A(); //在堆上分配
A A2(); //在栈上分配
A* p2 = &A2;
cout << "placement new前的值: " << p1->getValue() << " " << p2->getValue() << endl; A* p3 = new(p1) A(); //在p1的位置上构造
A* p4 = new(p2) A(); //在p2的位置上构造
cout << "placement new后的值: " << p1->getValue() << " " << p2->getValue() << endl;
}
第一次输出的是1,2;在相应位置构造后,输出值变为3,4。
C++中的new用法总结的更多相关文章
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- C#中string.format用法详解
C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...
- SQL中distinct的用法
SQL中distinct的用法 1.作用于单列 2.作用于多列 3.COUNT统计 4.distinct必须放在开头 5.其他 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出 ...
- Oracle 中 decode 函数用法
Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...
- jQuery中Animate进阶用法(一)
jQuery中animate的用法你了解多少呢?如果仅仅是简单的移动位置,显示隐藏,哦!天哪你在浪费资源!因为animate太强大了,你可以有很多意想不到的用法!让我们一起研究一下吧~~ 首先要了解j ...
- [转载]js中return的用法
一.返回控制与函数结果,语法为:return 表达式; 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果 二.返回控制,无函数结果,语法为:return; 在大多数情况下,为事件处理函 ...
- js中this的用法
经过近几周的模拟面试题,我查询了一些资料,今天就来说说,在js中this的用法吧.方法有四:第一,用作全局变量,第二,用作表该对象,第三,用作构造函数,第四,用作call和applay
- jQuery中eq()方法用法实例
本文实例讲述了jQuery中eq()方法用法.分享给大家供大家参考.具体分析如下: 此方法能够获取匹配元素集上的相应位置索引的元素. 匹配元素集上元素的位置索引是从0开始的. 语法结构: 复制代码 代 ...
- php中return的用法实例分析
本文实例讲述了php中return的用法.分享给大家供大家参考.具体分析如下: 首先,它的意思就是返回;return()是语言结构而不是函数,仅在参数包含表达式时才需要用括号将其括起来.当返回一个变量 ...
- mysql中event的用法详解
一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...
随机推荐
- Go -- 实现二叉搜索树
树: https://suanfa.herokuapp.com/3%E6%A0%91/binarytree/ 数据结构 首先我们定义需要的数据结构.注意,TreeNode的左右节点都是*TreeNod ...
- Python机器学习--手写体识别(KNN+MLP)
MLP实现 调整参数比较性能结果 # -*- coding: utf-8 -*- """ Created on Wed Aug 30 21:14:38 2017 @aut ...
- AAuto如何发布EXE文件
1 如下图所示,谷歌翻译是AAuto提供的源码,我们现在把它做成软件.点击编译,注意看底部状态栏提示,编译之后的谷歌翻译还是aau格式的,双击可以直接运行.但是体积变大了,而且已经是二进制文件,无法再 ...
- Solidedge如何新建参考平面 参考面
1 建立平行平面 点击平行平面 点击参考平面,输入相对距离 2 建立成角平面 先选择基准面,再选则旋转轴(第二次点击一个平面,该平面与基准面相交形成的直线即为旋转轴) 输入角度即可完成(鼠标左 ...
- vimrc 避免中文乱码配置
et smsyntax onset ts=4set sts=4set sw=4set hlsearchset rulerset backspace=indent,eol,startset encodi ...
- Loadrunner IP欺骗
一.为什么要设置IP欺骗 1. 当某个IP的訪问过于频繁,或者訪问量过大时,server会拒绝訪问请求.这时候通过IP欺骗能够添加訪问频率和訪问量,以达到压力測试的效果. 2. 某些server配置了 ...
- HDOJ How many ways?? 2157【矩阵高速幂】
How many ways? ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Git的使用 -- 用git玩翻github,结尾有惊喜!有惊喜!有惊喜!林妙妙看了说:牛呲呼啦带闪电 (三)(超详解)
简介 上一篇主要讲解的是Git安装及配置,这一篇就详细的从无到有的来用Git玩翻github. 一.什么是Github Github是全球最大的社交编程及代码托管网站(https://github.c ...
- 父节点parentNode
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- Python——类的高级主题
介绍关于类的一些高级主题,这些是可选的,在Python应用程序中,不会常常遇到. =========================================================== ...