news 2026/8/21 7:38:07

C++用new创建对象和不用new创建对象的区别解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++用new创建对象和不用new创建对象的区别解析

我们都知道C++中有三种创建对象的方法,如下:

#include <iostream> using namespace std; class A { private: int n; public: A(int m):n(m) { } ~A(){} }; int main() { A a(1); //栈中分配 A b = A(1); //栈中分配 A* c = new A(1); //堆中分配 delete c; return 0; }

第一种和第二种没什么区别,一个隐式调用,一个显式调用,两者都是在进程虚拟地址空间中的栈中分配内存,而第三种使用了new,在堆中分配了内存,而栈中内存的分配和释放是由系统管理,而堆中内存的分配和释放必须由程序员手动释放。

所以这就产生一个问题是把对象放在栈中还是放在堆中的问题,这个问题又和堆和栈本身的区别有关:

这里面有几个问题:

1.堆和栈最大可分配的内存的大小

2.堆和栈的内存管理方式

3.堆和栈的分配效率

首先针对第一个问题,一般来说对于一个进程栈的大小远远小于堆的大小,在linux中,你可以使用ulimit -s (单位kb)来查看一个进程栈的最大可分配大小,一般来说不超过8M,有的甚至不超过2M,不过这个可以设置,而对于堆你会发现,针对一个进程堆的最大可分配的大小在G的数量级上,不同系统可能不一样,所以当你需要一个分配的大小的内存时,请用new,即用堆。

其次针对第二个问题,栈是系统数据结构,对于进程/线程是唯一的,它的分配与释放由操作系统来维护,不需要开发者来管理。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时,这些存储单元会被自动释放。栈内存分配运算内置于处理器的指令集中,效率很高,不同的操作系统对栈都有一定的限制。

堆上的内存分配,亦称动态内存分配。程序在运行的期间用malloc申请的内存,这部分内存由程序员自己负责管理,其生存期由开发者决定:在何时分配,分配多少,并在何时用free来释放该内存。这是唯一可以由开发者参与管理的内存。使用的好坏直接决定系统的性能和稳定。

由上可知,但我们需要的内存很少,你又能确定你到底需要多少内存时,请用栈。而当你需要在运行时才知道你到底需要多少内存时,请用堆。

最后针对第三个问题,栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率 比较高。

堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在 堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会 分 到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

由上可知,能用栈则用栈。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/8 0:33:49

Azure Dataverse 权限设计学习

1. 创建表 https://make.powerapps.com/ 2. 管理员配置权限端 https://admin.powerplatform.microsoft.com/ 3 Dataverse 权限设计 业务部门 -> 相当于组织架构 团队 -> 组织架构的分组权限&#xff0c;可以把业务部门下的人员放在多个团队 用户 -> 职员 角色 -…

作者头像 李华
网站建设 2026/8/9 5:34:47

事务ACID特性详解

一、ACID基本概念 1. 原子性&#xff08;Atomicity&#xff09; 定义&#xff1a;事务的所有操作要么全部完成&#xff0c;要么全部不完成&#xff0c;不会停留在中间状态 比喻&#xff1a;就像银行转账&#xff0c;A账户扣款和B账户入账必须同时成功或同时失败 实现机制&am…

作者头像 李华
网站建设 2026/8/6 8:58:03

2025-2026多智能体与AI代理领域10篇顶会论文精选:从协调行为到安全攻防

本文精选了2025-2026年间的10篇多智能体与AI代理领域的优秀论文&#xff0c;涵盖多智能体协调、异构目标跟踪、自我进化技能获取、时间约束执行、软件工程代理优化、提示注入攻击防御、战略对话生成、检索增强辩论、多模态空间推理及改变感知的缺陷预测等前沿研究方向。这些研究…

作者头像 李华
网站建设 2026/8/6 18:21:10

深度Agent评测全攻略:LangChain团队分享5大核心评测模式

LangChain团队分享了评测深度Agent的五大核心模式&#xff1a;定制化测试逻辑、单步评测、完整Agent轮次、多轮次运行评测及正确环境设置。与传统LLM评测不同&#xff0c;深度Agent评测需关注轨迹、状态和工具调用。单步评测适合开发快速迭代&#xff0c;完整轮次适合回归测试&…

作者头像 李华
网站建设 2026/7/31 9:29:45

图吧工具箱-电脑党必备!

目录 一、工具定位 二、核心功能模块&#xff1a;从检测到运维的全流程覆盖 1、模块 1&#xff1a;硬件信息采集——硬件参数的精准识别 2、模块 2&#xff1a;性能测试——硬件性能量化与瓶颈分析 3、模块 3&#xff1a;故障诊断——硬件故障定位与健康监控 4、模块 4&a…

作者头像 李华