IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ : 再谈new的使用 -> 正文阅读

[C++知识库]C++ : 再谈new的使用

1. 使用new运算符初始化

1.1 如果要为内置类型分配存储空间并初始化,可在类型名后面加上初始值,并将其用括号扩起。

int* a = new int(5);
double* b = new double(5.6);

这种做法也适合类的构造函数。

1.2 初始化常规结构或数组,需要用大括号的列表初始化(C++11)

struct Base
{
	int a; int b;
}
Base* one = new Base {1,2};

int* nums = new int[3] {1, 2, 3};

还可将初始化列表用于单值变量:

int* num =  new int {};
double* db = new double {1.2};

2.new失败时

new可能找不到请求的内存量。起初,这种情况让new返回空指针,但现在将引发异常 std::bad_alloc。

3.new:运算符、函数和替换函数

运算符new和new[]分别调用下列函数:

void* operator new(std::size_t); // new
void* operator new[](std::size_t); // new[]

这些函数被称为分配函数, 位于全局名称空间中。
是由delete和 delete[]调用的释放函数

void operator delete(void*);
void operator delete[](void*);

替换:

int* p1 = new int;
//->
int* p1 = new(sizeof(int));

int* p2 = new int[10];
//->
int* p2 = new(sizeof(int) * 10);

delete p1;
//->
delete(p1);

C++将这种函数称为可替换的。这意味着如果你有足够的知识和意愿,可为new和delete提供替换函数,并根据需要对其进行定制。

4.定位new运算符

头文件:

#include<new>

new运算符还有一种变体,被称为 定位(placement)new运算符, 可以使你能够指定要使用的内存位置
使用时需要加头文件,并将new运算符用于提供了所需地址的参数。

示例:

#include<new>
using namespace std;

char buffer1[20];
char buffer2[200];
int main(void)
{
	//普通new,在堆区申请
	int* p1 = new int;
	int* p2 = new int[10];
	//定位new在指定位置申请
	int* p3 = new(buffer1) int;
	int* p4 = new(buffer2) int[10];

	delete p1;
	delete[]p2;
	delete p3;
	delete[]p4;
	return 0;
}

在这里插入图片描述

通过监视器可以看出 定位new申请空间的地址,和指定的位置相同。

程序示例

#include<iostream>
#include<new>
using namespace std;

const int BUF = 512;
const int N = 5;
char buffer[BUF];
const int MOD = 1000;

int main(void)
{
	double* pd1, * pd2;
	int i;
	cout << "Calling new and placement new:\n";
	pd1 = new double[N];
	pd2 = new(buffer) double[N];

	for (i = 0; i < N; ++i)
	{
		pd2[i] = pd1[i] = MOD + 20.0 * i;
	}
	cout << "Memory addresses:\n" << "heap: " << pd1
		<< " static: " << (void*)buffer << endl;
	cout << "Memory contents:\n";
	for (i = 0; i < N; ++i)
	{
		cout << pd1[i] << " at " << &pd1[i] << "; ";
		cout << pd2[i] << " at " << &pd2[i] << endl;
	}

	cout << "\nCalling new and placement new a second time:\n";
	double* pd3, * pd4;
	pd3 = new double[N];
	pd4 = new(buffer) double[N];
	for (i = 0; i < N; ++i)
	{
		pd4[i] = pd3[i] = MOD + 40.0 * i;
	}
	cout << "Memory contents:\n";
	for (i = 0; i < N; ++i)
	{
		cout << pd3[i] << " at " << &pd3[i] << "; ";
		cout << pd4[i] << " at " << &pd4[i] << endl;
	}

	cout << "\nCalling new and placement new a third times:\n";
	delete[]pd1;
	pd1 = new double[N];
	pd2 = new(buffer + N * sizeof(double)) double[N];
	for (i = 0; i < N; ++i)
	{
		pd2[i] = pd1[i] = MOD + 60.0 * i;
	}
	cout << "Memory contents:\n";
	for (i = 0; i < N; ++i)
	{
		cout << pd1[i] << " at " << &pd1[i] << "; ";
		cout << pd2[i] << " at " << &pd2[i] << endl;
	}
	delete[]pd1;
	delete[]pd3;

	return 0;
}

运行示例:

在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 12:43:52  更:2022-03-06 12:46:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:25:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码