new动态内库管理库学习

news/2024/11/20 23:33:28/

new文件是动态内存管理库的一部分,特别提供低层内存管理特性。 它包括bad_alloc, bad_array_new_length,nothrow_t,align_val_t类nothrow常量,以及函数 operator newoperator new[],operator deleteoperator delete[],get_new_handler,set_new_handle等,
下面介绍它们的基本使用。

1.new与delete

new是动态分析内存,delete是释放分配的内存,它们是成对使用的。

代码示例:

#include <iostream>
#include <new>using namespace std;class Person {
public:Person(string name, int age) :m_name(name),m_age(age) { }private:string m_name;int m_age;
};int main()
{Person *p = new Person("camel", 28);cout << "p==============" << p << endl;cout << "sizeof(*p)=====" << sizeof(*p) << endl;//debug 版32个字节 release版28个字节delete p;cout << "Hello World!" << endl;return 0;
}

运行结果:

 2.new[]和delete[]

new[]为数组分配内存但没有初始化,释放时使用delete[],它们是成对使用。

示例代码:

int main()
{int *p2 = new int[2];cout << "p2=============" << p2 << endl;cout << "sizeof(*p2)====" << sizeof(*p2) << endl;cout << "p2[0]==========" << p2[0] << endl;cout << "p2[1]==========" << p2[1] << endl;p2[0] = 20;p2[1] = 30;cout << "p2[0]==========" << p2[0] << endl;cout << "p2[1]==========" << p2[1] << endl;delete[] p2;cout << "Hello World!" << endl;return 0;
}

 运行结果:

3.bad_alloc

 bad_alloc 是分配函数作为异常抛出的对象类型,以报告存储分配失败。

int main()
{try {while (true) {new int[100000000ul];   // 抛出重载}} catch (const std::bad_alloc& e) {cout << "exception info:" << e.what() << endl;}cout << "Hello World!" << endl;return 0;
}

运行结果:

 4.nothrow

nothrow是std::nothrow_t类型的常量,当内存分析失败时不抛出异常,这个时候返回为nullptr。

示例代码:

int main()
{while (true) {int* p = new(std::nothrow) int[100000000ul]; // 不抛出重载if (p == nullptr) {cout << "Allocation returned ========================= nullptr" << endl;break;}}cout << "Hello World!" << endl;return 0;
}

运行结果:

 5.bad_array_new_length

bad_array_new_length是new表达式出现异常时报告非法数组长度的对象类型。有下在三种情况会抛出异常:

1) 数组长度为负

2) 新数组的总大小将超过实现定义最大值

3) 初始化器子句的数量超出要初始化的元素数量

仅数组第一维可生成此异常;第一维外的维数是常量表达式,在编译时得到检查。

示例代码:

int main()
{int negative = -1;int small = 1;int large = INT_MAX;try {new int[negative];           // 负大小: bad_array_new_lengthnew int[small]{1,2,3};       // 过多初始化器: bad_array_new_lengthnew int[large][1000000];     // 过大: bad_alloc 或 bad_array_new_length} catch(const std::bad_array_new_length &e) {cout << "exception info:" << e.what() << '\n';} catch(const std::bad_alloc &e) {cout << "exception info:" << e.what() << '\n';}cout << "Hello World!" << endl;return 0;
}

运行结果:

 

参考:

标准库头文件 <new> - cppreference.com


http://www.ppmy.cn/news/34762.html

相关文章

【进阶C语言】指针的进阶(万字图文详解)

指针的进阶1. 字符指针2. 指针数组3. 数组指针3.1 数组指针的定义3.2 &数组名VS数组名3.3 数组指针的使用4. 数组参数、指针参数4.1 一维数组传参4.2 二维数组传参4.3 一级指针传参4.4 二级指针传参5. 函数指针6. 函数指针数组7. 指向函数指针数组的指针8. 回调函数指针的主…

[数据结构]排序算法

目录 常用排序算法的实现&#xff1a;&#xff1a; 1.排序的概念及其运用 2.插入排序 3.希尔排序 4.选择排序 5.冒泡排序 6.堆排序 7.快速排序 8.归并排序 9.排序算法复杂度及稳定性分析 10.排序选择题练习 常用排序算法的实现&#xff1a;&#xff1a; 1.排序的概念及其运用…

从 X 入门Pytorch——BN、LN、IN、GN 四种归一化层的代码使用和原理

Pytorch中四种归一化层的原理和代码使用前言1 Batch Normalization&#xff08;2015年提出&#xff09;Pytorch官网解释原理Pytorch代码示例2 Layer Normalization&#xff08;2016年提出&#xff09;Pytorch官网解释原理Pytorch代码示例3 Instance Normalization&#xff08;2…

使用SOLIDWORKS2017绘制开关电源变压器教程

更多开关电源器件建模教程&#xff0c;敬请关注FANyi课堂&#xff01;如下图所示&#xff0c;分别为solid works绘图界面的效果&#xff0c;及模型装载到PCB库时的效果。建模方法&#xff1b; ● 分析图纸上图是变压器骨架部分图纸&#xff0c;变压器骨架与我们实际使用的模型正…

华为笔试题OD

华为笔试题OD 1题 华为od-2022.11.5-k优雅阈值 题目内容 如果一个数组中出现次数最多的元素出现大于等于 &#xfffd;k 次&#xff0c; 被称为 &#xfffd;−优雅数组k−优雅数组 &#xff0c; &#xfffd;k 也可以被称为优雅阈值。 例如&#xff0c;数组 [1,2,3,1,2,3,…

SLAM算法之HectorSLAM,Gmapping,KartoSLAM,CoreSLAM和LagoSLAM

文章将介绍使用的基于机器人操作系统&#xff08;ROS&#xff09;框架工作的SLAM算法。 在ROS中提供的五种基于2D激光的SLAM算法分别是&#xff1a;HectorSLAM&#xff0c;Gmapping&#xff0c;KartoSLAM&#xff0c;CoreSLAM和LagoSLAM。当然最后还有比较经典的google开源的ca…

如何统计程序或函数调用时间

time() 1、clock() 函数&#xff0c;返回从 开启这个程序进程 到 程序中调用clock&#xff08;&#xff09;函数 时之间的CPU时钟计时单元数&#xff0c;返回单位是毫秒&#xff0c;可以用常量CLOCKS_PER_SEC&#xff0c; 这个常量表示每一秒有多少个时钟计时单元。2、time(&am…

SpringBoot 使用Druid实现数据库连接池并结合AOP实现多数据源

SpringBoot 使用Druid实现数据库连接池并结合AOP实现多数据源 一. 配置Druid二. 实现多数据源三. 添加注解四. 业务代码五. 测试六. 总结Spring Boot是一个快速开发Spring应用程序的框架,而Druid是一个高性能的数据库连接池,可以提高数据库访问的效率。在Spring Boot中使用Dr…