当前位置: 首页 > news >正文

【C++指针】 construct_at 和 uninitialized_copy 方法

一、new过对象吗?

这样的代码

int*p=newint(10);// 申请内存 + 放个10进去deletep;// 清理

new 干了什么事?

  1. 申请一块内存(找操作系统要空间)
  2. 在这块内存上放个对象(构造)

二、拆开做?

想象你去饭店吃饭

正常情况分开做的情况
点菜 → 吃饭 → 结账包场办宴会
正常new/delete先包场地,再一桌桌上菜

什么时候要分开做?

// 场景1:一次性要100个int的空间,但先不赋值int*buffer=newint[100];// 这就new好了,但里面的值是随机的// 场景2:从别处拷贝数据过来intsource[5]={1,2,3,4,5};// 想把source的数据放到buffer的前5个位置

三、construct_at:在指定位置放对象

举个例子

#include<iostream>#include<memory>usingnamespacestd;intmain(){// 1. 先找块内存(就像先找块空地)void*place=operatornew(sizeof(int));// 找了块能放int的空地// 2. 在这块地上放个对象(construct_at)int*p=construct_at(static_cast<int*>(place),100);// ↑这块地 ↑放个值100进去cout<<"p指向的值: "<<*p<<endl;// 输出100// 3. 用完要清理destruct_at(p);// 把对象析构(清空这块地)operatordelete(place);// 把内存还给系统}

对比 new

// new的方式int*p1=newint(100);// 找地 + 放对象 一步完成deletep1;// 清空 + 还地 一步完成// construct_at的方式void*mem=operatornew(sizeof(int));// 只找地int*p2=construct_at((int*)mem,100);// 只放对象destruct_at(p2);// 只清空地operatordelete(mem);// 只还地

四、uninitialized_copy:批量拷贝到空地

#include<iostream>#include<memory>usingnamespacestd;intmain(){// 源数据:已经摆好的桌子intsource[5]={10,20,30,40,50};// 目标地:一片空地(未初始化的内存)int*dest=(int*)operatornew(sizeof(int)*5);// 看看空地里的随机值cout<<"空地里的垃圾值: ";for(inti=0;i<5;i++){cout<<dest[i]<<" ";// 随机数}cout<<endl;// 把source的桌子搬到空地上(uninitialized_copy)uninitialized_copy(begin(source),end(source),dest);// ↑从哪里搬 ↑搬到哪cout<<"搬完之后: ";for(inti=0;i<5;i++){cout<<dest[i]<<" ";// 10 20 30 40 50}cout<<endl;// 搬完要清理for(inti=0;i<5;i++){destruct_at(dest+i);// 一张张桌子撤掉}operatordelete(dest);// 把地还给系统}

五、为什么要用 uninitialized_copy 而不是普通 copy?

对比一下

vector<int>v(5);// v已经构造好了(里面已经有5个int)int*raw=(int*)malloc(sizeof(int)*5);// raw是原始内存// 普通copy:目标必须已经构造好copy(source,source+5,v.begin());// ✅ v已经构造好了copy(source,source+5,raw);// ❌ raw是原始内存,不行!// uninitialized_copy:目标可以是原始内存uninitialized_copy(source,source+5,raw);// ✅ 专门处理原始内存

六、记住三点就行

1. construct_at = 在空地上放东西

construct_at(地址,);// 在地址指向的内存放个值为...的对象

2. uninitialized_copy = 批量搬东西到空地

uninitialized_copy(开始,结束,目标);// 把一段数据搬到目标空地

3. destruct_at = 把东西撤走

destruct_at(地址);// 析构地址上的对象(清理)
http://www.jsqmd.com/news/421078/

相关文章:

  • CVAT辅助标注工具介绍与本地部署教程
  • DeepSpeed 训练实战:解决 FP16 梯度溢出与 BF16 迁移指南
  • 标题文字的渐变色
  • AI 驱动的自动化脚本维护:动态定位器修复技术解析
  • 【C++指针】 数组名与指针:为什么datas和sizeof(datas)的行为不同?
  • CI流水线质量门禁的7个关键节点与实施策略
  • 可可收麦德龙购物卡线上回收攻略:避开虚高陷阱,安全回收更省心 - 可可收
  • 从此告别拖延,AI论文工具 千笔写作工具 VS 灵感风暴AI,专科生专属利器!
  • C++中的 赋值和初始化
  • 互联网大厂Java面试场景:从基础到微服务与云原生
  • 实测才敢推AI论文平台,千笔 VS 笔捷Ai,专科生写作更省心!
  • 从全栈开发到微服务架构:一场真实的技术面试
  • 2026年2月防火卷帘门企业推荐,消防验收无忧与合规生产厂家 - 品牌鉴赏师
  • Appium跨平台测试的致命陷阱与系统性规避策略
  • 用过才敢说!专科生必备的降AIGC网站 —— 千笔·降AIGC助手
  • 全自动超声波气象站
  • 可可收科普:闲置立减金别乱处理!这 4 个误区正在坑人 - 可可收
  • 2026年有名的直播带货培训公司推荐,浙江育达教育值得关注 - mypinpai
  • 科研党收藏!圈粉无数的AI论文软件 —— 千笔ai写作
  • 便携式EL测试仪
  • 推荐MySQL中的这10种高级用法
  • 2026口碑不错的装饰一体板定制厂家排行,别错过,真空绝热板保温装饰一体板,装饰一体板生产厂家推荐 - 品牌推荐师
  • 建议收藏|小白程序员必看:AI 时代不会被淘汰,从零入门大模型应用开发全路径
  • 在线培训考试系统哪个好?全维度选型指南与深度解析
  • 【山海鲸实战案例】通过跟随相机设置无人机视角巡航
  • 分析溪山里酒店创新能力怎么样,在贵阳酒店行业排名如何? - 工业推荐榜
  • 终于有人把牛客网上的Java面试八股文整理成了PDF合集(Java基础+Redis+MySQL+多线程与高并发+JVM+分布式+Spring+微服务)
  • 收藏 | LangGraph+MCP+ReactAgent:小白也能学会构建智能代理系统,解锁大模型进阶玩法
  • 2026年高端月子会所最新推荐:西安金月汇/金月子以标准化领先行业 - 深度智识库
  • 基于PLC的喷泉控制系统设计商品介绍