C++ new 运算符 用法总结
C++ new 运算符 用法总结
使用 new 运算符 分配内存 并 初始化
1.分配内存初始化标量类型(如 int 或 double),在类型名后加初始值,并用小括号括起,C++11中也支持大括号。
int * pi = new int (6);
double * pd = new double (9.99);
//C++11中, 支持以下写法
int * pi = new int {6};
double * pd = new double {9.99};
2.初始化结构或数组,需要使用大括号列表初始化 ,需编译器 支持 C++11。
struct where{double x; double y; double z;};
where * one = new where {1.2, 2.2, 3.2};
int * ar = new int [4] {1, 2, 3, 4};
3.使用 delete 释放 new分配的内存 (仅限于常规 new 分配的 堆内存)
delete pi;
delete pd;
delete one;
// 释放数组 记住 加[]
delete [] ar;
4.创建类对象
(1)new创建对象,pTest用来接收对象指针。new申请的对象,则只有调用到delete时才会执行析构函数,如果程序退出而没有执行delete则会造成内存泄漏:
CTest* pTest = new CTest(); delete pTest;
(2)不用new,直接使用类定义申明,使用完后不需要手动释放,该类析构函数会自动执行:
CTest mTest;
(3)使用普通方式创建的类对象,在创建之初就已经分配了内存空间。而类指针,如果未经过对象初始化,则不需要delete释放:
CTest* pTest = NULL;
new 失败时处理方式
1.常规分配内存,调用构造函数。分配失败时,抛出异常。定义如下:
void* operator new(std::size_t) throw(std::bad_alloc);
void operator delete(void *) throw();
分配失败则抛出异常std::bad_alloc,不是返回NULL,所以判断返回值是否为NULL是没用的。
char *p=new char[size]; //分配失败,不是返回NULL
delete [] p;
2.不抛出异常。分配失败时,返回NULL。定义如下:
void* operator new(std::size_t,const std::nothrow_t&) throw();
void operator delete(void*) throw();
char *p=new(nothrow) char[size]; //分配失败,是返回NULL
if(NULL==p)
cout<<"alloc failure!"<<endl;
new: 运算符、函数和替换函数
运算符new 和 new [] 分别调用如下函数:
void * operator new(std::size_t); //use by new
void * operator new [] (std::size_t); //use by new []
运算符delete 和 delete [] 分别调用如下函数:
void * operator delete(void *); //use by delete
void * operator delete [](void *); //use by delete []
这些函数称为 分配函数 ,位于全局名称空间中。std::size_t 是一个 typedef。
例:
int * pi = new int;
//将转换为下面这样
int * pi = new (sizeof(int));
int * pi = new int[40];
//将转换为下面这样
int * pi = new (40 * sizeof(int));
//同样的
delete pi;
//将转换为下面这样
delete (pi);
定位 placement new 运算符
通常,new负责在 堆 中分配一个足以满足要求的内存块,但 定位new可以让程序员指定要使用的内存位置。不会内存分配失败,因为它根本不分配内存,只调用对象的构造函数。它允许在一块已经分配成功的内存上重新构造对象或对象数组。定义如下:
void* operator new(size_t,void*);
void operator delete(void,void);
1.使用 定位new运算符,首先要包含 头文件 new
#include<new>
using namespace std;
struct chaff
{
char dross[20];
int slag;
};
char buffer1[50];
char buffer2[200];
int main()
{
chaff * p1, p2;
p2 = new (buffer1) chaff; // 在buffer1中
p2 = new (buffer2) int[20]; // 在buffer2中
}
2.使用placement new构造起来的对象或数组,要显式调用它们的析构函数来销毁(析构函数并不释放对象的内存),千万不要使用delete.这是因为placement new构造起来的对象或数组大小并不一定等于原来分配的内存大小,使用delete会造成内存泄漏或者之后释放内存时出现运行时错误。
3.当使用new运算符定义一个多维数组变量或数组对象时,它产生一个指向数组第一个元素的指针,返回的类型保持了除最左边维数外的所有维数。
C++ new 运算符 用法总结的更多相关文章
- javascript typeof()的用法与运算符用法
typeof 运算符 返回一个用来表示表达式的数据类型的字符串. typeof[()expression[]] ; expression 参数是需要查找类型信息的任意表达式. 说明 typeof 运算 ...
- Swift数组的加法运算符用法:array1 += array2
var stringList1 = [String]() //创建String类型空数组 var stringList2 = ["1", "3", " ...
- php中三元运算符用法
代码如下: <?php $handle=fopen("../good/html/1.txt", "r"); while(!feof($handle)) / ...
- js中的相等与逗号运算符用法
/** * 相等运算符 '==',相等则返回true,不等则返回false * - 用 '==' 来比较两个值时,若值的类型不同,则会自动进行类型 * 转换,将其转换为相同的类型然后再进行比较. */ ...
- 【Java学习笔记之二十三】instanceof运算符的用法小结
instanceof运算符用法 运算符是双目运算符,左面的操作元是一个对象,右面是一个类.当左面的对象是右面的类创建的对象时,该运算符运算的结果是true,否则是false 说明: (1)一个类的实例 ...
- instanceof 运算符
java中的instanceof=======>二元运算符 用法: result = object instanceof class 参数: result 是boolean类型 object 是 ...
- SQL Server调优系列基础篇(联合运算符总结)
前言 上两篇文章我们介绍了查看查询计划的方式,以及一些常用的连接运算符的优化技巧,本篇我们总结联合运算符的使用方式和优化技巧. 废话少说,直接进入本篇的主题. 技术准备 基于SQL Server200 ...
- CString用法总结
概述:CString是MFC中提供的用于处理字符串的类,是一种很有用的数据类型. 它很大程度上简化了MFC中的许多操作,使得MFC在做字符串操作时方便了很多. 不管怎样,使用CString有很多的特殊 ...
- swift学习(二)--基本运算符、字符串、集合操作
在这一篇博客里面,我想要介绍一下swift里面一些常用的基本运算符,还有涉及到的字符串,集合操作.你会发现在swift里面还是有许多其他语言所不具有的特性运算操作的. 首先最基本的+,-,*,/,&g ...
随机推荐
- JDK1.8源码(三)——java.lang.String类
一.概述 1.介绍 String是一个final类,不可被继承,代表不可变的字符序列,是一个类类型的变量.Java程序中的所有字符串字面量(如"abc")都作为此类的实例实现,&q ...
- Linux档案权限篇(一)
查看档案的属性"ls-al". 即列出所有的档案的详细权限与属性(包括隐藏文件) 权限 第一个字符代表档案的类型: d:代表是目录 -:代表是文件 l:代表是连接文件(相当于win ...
- Python turtle.right与turtle.setheading的区别
一.概念 turtle.right与turtle.left用法一致,我们以turtle.right为例进行讲述. turtle.right(angle)向右旋转angle角度. turtle.seth ...
- 数据结构与算法——迪杰斯特拉(Dijkstra)算法
tip:这个算法真的很难讲解,有些地方只能意会了,多思考多看几遍还是可以弄懂的. 应用场景-最短路径问题 战争时期,胜利乡有 7 个村庄 (A, B, C, D, E, F, G) ,现在有六个邮差, ...
- Linux从头学15:【页目录和页表】-理论 + 实例 + 图文的最完全、最接地气详解
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...
- Java编译运行环境讨论(复古但能加深对Java项目的理解)
Java编译运行环境讨论(复古但能加深对Java项目的理解) 如今我们大多数情况都会使用IDE来进行Java项目的开发,而一个如今众多优秀的IDE已经能够帮助我们自动的部署并调试运行我们的Java程序 ...
- 官宣!ElasticJob 3.0.0 版本正式发布
ElasticJob 是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成.它通过弹性调度.资源管控.以及 ...
- SQL 居然还能在 Apache ShardingSphere 上实现这些功能?
在去年 10 月 5.0.0-alpha 版本发布之后,Apache ShardingSphere 经历了长达 8 个多月的持续开发与优化,终于在 6 月 25 日正式迎来了 5.0.0-beta 版 ...
- Java基础之(三):IDEA的安装及破解
IDEA的安装 IDEA官网:IDEA 点击IJ 找好操作系统,点击下载 双击打开,自己找个安装路径 勾选这两个即可 旗舰版破解及汉化 上面是个人社区版,是免费的,但是如果想要使用汉化版的,需要寻找插 ...
- MyBatis原生批量插入的坑与解决方案!
前面的文章咱们讲了 MyBatis 批量插入的 3 种方法:循环单次插入.MyBatis Plus 批量插入.MyBatis 原生批量插入,详情请点击<MyBatis 批量插入数据的 3 种方法 ...