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

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

  1. new创建类对象需要指针接收,一处初始化,多处使用
  2. new创建类对象使用完需delete销毁
  3. new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间
  4. new对象指针用途广泛,比如作为函数返回值、函数参数等
  5. 频繁调用场合并不适合new,就像new申请和释放内存一样
  6. 栈的大小远小于堆的大
  7. 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率 比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在 堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会 分 到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多

最新文章

  1. C#实现:给定任意要给字符串,输出所有可能的回文的子字符串集合。
  2. perl基本语法--转载
  3. j2ee log4j集中式日志解决方案logpool-v0.4发布说明
  4. IE11无法 登陆银行网站
  5. js错误:对象不支持此属性或方法
  6. java关键字-transient
  7. Mac OS X安装之虚拟机环境下的总结
  8. Tweak 中系统方法写入文件到根目录下面失败
  9. html页面头部里的meta
  10. Oracle-05:伪表dual
  11. 【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis
  12. DBA思考系列&mdash;&mdash;学会拒绝不合理的需求
  13. at java.net.InetAddress.getLocalHost(InetAddress.java:1475)
  14. MySQL冷知识
  15. 怎样让CodeBlocks支持C99
  16. 在vue中使用animate.css
  17. Forcing restore from package sources
  18. BZOJ3196:二逼平衡树(线段树套Splay)
  19. druid问题记录
  20. poj 2965 The Pilots Brothers&#39; refrigerator (dfs)

热门文章

  1. 使用Setup安装Windows8 RTM方法
  2. 史前埃及(predynastic egypt)
  3. Linux:man命令显示颜色
  4. 添加react-router
  5. 移动端自动化openatx开源项目介绍,pytest并发测试框架结合
  6. SSH项目搭建(五)——web.xml文件配置
  7. sed使用笔记
  8. (1)变量、常量、程序交互、数据类型、bool、基本运算符
  9. CTF-练习平台-Misc之 妹子的陌陌
  10. 第二百七十六节,MySQL数据库,【显示、创建、选定、删除数据库】,【用户管理、对用户增删改查以及授权】