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

相关文章

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...

Nginx实现动态封禁IP的步骤指南

《Nginx实现动态封禁IP的步骤指南》在日常的生产环境中,网站可能会遭遇恶意请求、DDoS攻击或其他有害的访问行为,为了应对这些情况,动态封禁IP是一项十分重要的安全策略,本篇博客将介绍如何通过NG... 目录1、简述2、实现方式3、使用 fail2ban 动态封禁3.1 安装 fail2ban3.2 配

Vue3中的动态组件详解

《Vue3中的动态组件详解》本文介绍了Vue3中的动态组件,通过`component:is=动态组件名或组件对象/component`来实现根据条件动态渲染不同的组件,此外,还提到了使用`markRa... 目录vue3动态组件动态组件的基本使用第一种写法第二种写法性能优化解决方法总结Vue3动态组件动态

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::