C++primer -动态数组与allocator类

2024-03-11 01:44

本文主要是介绍C++primer -动态数组与allocator类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

动态数组不是数组,只是一串动态分配的连续内存空间,指向动态数组的指针是指向该连续空间的首元素地址。

可以申请一个大小为0的动态数组,但不能申请一个大小为0的数组。但C++中通常使用动态数组来完成数组行为。

释放动态数组:

释放动态数组使用delete[] p; delete[] p 和delete p 的区别在于delete[] p会调用多次析构函数,而delete p只调用一次,但对于内置数据类型它们的效果一样,因为内置数据类型没有析构函数。

可以使用一个unique_ptr指向一个动态数组:

unique_ptr<int> up = new int[10];// 元素默认初始化,up中保存的是首元素地址

unique_ptr<int> up = new int[10](); // 元素值初始化

释放unique_ptr:

up.release(); // 销毁指针保留内存

使用unique_ptr管理动态数组时不能使用点运算符和箭头运算符,但可以使用下标, 如:up[5];

shared_ptr不直接支持动态数组,需要自定义删除器

shared_ptr<int> sp (new int[10], [](int* p){delete[] p;}); // 删除器操作的对象是shared_ptr保存的指针

sp.reset(); // 若计数为0,使用提供的lambda表达式删除sp所指向的对象

shared_ptr未定义下标运算,并且不支持指针与整数的运算,所以使用shared_ptr管理动态数组,只能用sp.get()获取其内置指针后访问: *(sp.get()+2) = i;

allocator类:

将内存分配与创建对象分离的类,用于管理连续的多个动态内存对象;它分配大块内存并在需要使用时才创建指针对象;

头文件:allocator

allocator类操作:

#include<allocator>allocator<T>  a;a.allocate(n); // 分配n个动态内存, 并返回一个指向首元素的指针a.deallocate(p, n); // 回收p指向的n个内存(创建时必须使用的是p、n),回收时内存中的对象必须已执行destroya.construct(p, args); // 在p指向的内存中以args为构造参数构造一个对象a.destroy(p); // 对p所指对象进行析构

一个完整使用allocator类的案例:

以下案例效果是创建了一个

#include<allocator>std::allocator<string> a;auto const* p = a.allocate(10); // p是指向allocte申请的10个动态内存的首元素的指针。auto q = p;a.construct(q++); // 创建一个对象,该对象默认初始化a.construct(q++, 10, 'c'); // 在申请内存中的第二个位置创建对象,对象的值是"cccccccccc"a.construct(q++, "abc");// statementswhile( q != p){a.destroy(--q);} // 销毁在内存上创建的对象a.deallocate(p, 10); // 回收内存

allocator类的uninitialized系列:

allocator类的uninitialized系列(拷贝或填充原始空间)算法可以在指针指向的原始空间中,创建对象:

  • uninitialized_copy(b, e, b2); // 将迭代器序列中[b, e)的元素拷贝到b2所指的原始空间,返回指向最后一个构造元素之后的指针
  • uninitalized_copy_n(b, n, b2); // 将从b开始的n个元素序列拷贝到b2所指的原始空间,返回指向最后一个构造元素之后的指针
  • uninitalized_fill(b, e, t); // 用t值填充构造[b, e)的原始空间,返回指向最后一个构造元素之后的指针
  • uninitialized_fill_n(b, n, t); // 用n个t值填充构造从b开始的原始空间,返回指向最后一个构造元素之后的指针

这篇关于C++primer -动态数组与allocator类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/796204

相关文章

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE