C++new和allocator

本文介绍了使用C++进行内存管理的方法,包括使用new和delete操作符动态分配和释放数组,利用typedef简化数组类型的声明,并展示了如何通过allocator进行内存分配、构造和销毁对象的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<string>
#include<vector>
#include<memory>

using namespace std;

int *p = new int[10];//两种用new的方法

typedef int arrT[42];
int *q =new arrT;

delete []p;


allocator<string> number;//定义一个名为number的allocator对象,可以为类型为int的对象分配内存

auto m = number.allocate(10);
auto n = m;

number.construct(n++, 10, 'c');

number.destroy(n);


### C++ 中 `allocator` 的使用方法及作用 #### 基本概念 在C++标准库中,`allocator` 是一种用于动态内存管理的模板类。其主要职责是在不初始化对象的情况下分配释放原始存储空间。这使得程序员可以在稍后的某个时间点自行决定如何以及何时构造这些对象。 #### 分配与释放内存 为了获取一段未经任何处理的新鲜地址空间,可以利用成员函数 `allocate()` 来实现这一目标。此过程仅涉及裸指针级别的资源预留而不触发默认构造函数执行[^1]: ```cpp std::allocator<int> alloc; auto const n = 100; // 请求分配的数量 int* p = alloc.allocate(n); ``` 需要注意的是,在上述代码片段里所获得的是一片连续但尚未关联具体类型的字节数组;因此如果希望在这之上创建实际可用的对象,则需进一步采取措施。 #### 构造与销毁对象 由于经由 `allocate()` 获取到的空间处于未初始化状态,所以在真正投入使用前还需借助于另一个重要工具——即 `construct()` 方法来进行显式的实例化工作。下面的例子展示了三种不同方式下的元素构建逻辑[^4]: ```cpp // 创建一个空字符串并放置于指定位置处 alloc.construct(q++); // 初始化含有十个字符 'c' 组成的新实体 alloc.construct(q++, std::string(10, 'c')); // 复制已存在的 "hi" 字符串至另一新址上 alloc.construct(q++, std::string("hi")); ``` 当不再需要某些特定项时,应当及时调用对应的析构接口 (`destroy()`) 来清理现场以免造成悬垂引用等问题的发生: ```cpp while (q != p) { alloc.destroy(--q); } ``` 最后一步则是彻底回收之前占用过的那部分区域以便后续重复利用或是交还给操作系统层面做统一调配之用(`deallocate()`): ```cpp alloc.deallocate(p, n); ``` #### 解决 `new` 运算符局限性 相较于传统的 `new[]` 表达式而言,采用自定义分配策略能够有效规避掉一些潜在缺陷。例如当我们预先知晓即将要开辟多大尺寸的一段区间却暂时无法确定内部究竟会填充哪些数据结构时,此时便可通过这种方式灵活应对而无需担心不必要的开销浪费现象出现[^5].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值