精华内容
下载资源
问答
  • C++中栈内存和堆内存区别 栈内存:当对象** 所在的函数体**执行完毕时,栈内存里的数据就会被清理。如:Student std;(是栈内存) 堆内存:会一直存在,执行delete是会清楚。如果是指针要记得将指针置nullptr。如:...

    C++中栈内存和堆内存区别

    • 栈内存:当对象** 所在的函数体**执行完毕时,栈内存里的数据就会被清理。如:Student std;(是栈内存)
    • 堆内存:会一直存在,执行delete是会清楚。如果是指针要记得将指针置nullptr。如:Student str = new Student();
    展开全文
  • JavaScript栈内存和堆内存区别

    千次阅读 2017-12-03 16:19:10
    栈这两个字我们已经接触多很多次,那么具体是什么存在栈中... 基本类型就是保存在栈内存中的简单数据段,而引用类型指的是那些保存在堆内存中的对象。1、基本类型 基本类型有Undefined、Null、Boolean、Number S

    和栈这两个字我们已经接触多很多次,那么具体是什么存在栈中什么存在堆中呢?就拿JavaScript中的变量来说:
    首先JavaScript中的变量分为基本类型和引用类型。
    基本类型就是保存在栈内存中的简单数据段,而引用类型指的是那些保存在堆内存中的对象。

    1、基本类型
    基本类型有Undefined、Null、Boolean、Number 和String。这些类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们通过按值来访问的。

    2、引用类型
    引用类型,值大小不固定,栈内存中存放地址指向堆内存中的对象。是按引用访问的。如下图所示:栈内存中存放的只是该对象的访问地址,在堆内存中为这个值分配空间。由于这种值的大小不固定,因此不能把它们保存到栈内存中。但内存地址大小的固定的,因此可以将内存地址保存在栈内存中。 这样,当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用访问。
    这里写图片描述
    其他语言中的内存分配类似。

    为什么会有栈内存和堆内存之分?
    通常与垃圾回收机制有关。为了使程序运行时占用的内存最小。
    当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;
    当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。

    展开全文
  • 栈内存和堆内存有什么区别

    千次阅读 2019-03-22 18:17:00
    栈内存和堆内存有什么区别栈内存和堆内存是什么?有什么用? 栈内存堆内存是什么? 栈内存和堆内存都是存储数据的地方。 为什么会分栈内存和堆内存?? 因为栈内存中存储的值的大小是固定的,...

    栈内存和堆内存有什么区别?

    栈内存堆内存是什么?有什么用?

    栈内存堆内存是什么?

    栈内存堆内存都是存储数据的地方。

    为什么会分栈内存堆内存??

    因为栈内存中存储的值的大小是固定的,堆内存中存储值的大小不固定的。

    基本数据类型

    目前有5种基本数据类型:StringNumberBooleanNullnull,这5种基本数据类型传递时,是按值传递的;在分配内存时,会分配固定大小的内存空间。
    ```
    let a = 1
    let b = a

    b = 3
    
    console.log( a ) // 1

    a=1因为1是基本数据类型,所以会在栈内存中分配固定大小的空间给a
    b=a因为a是基本数据类型,所以会在栈内存中分配固定大小的空间给b,并存入值为1

    引用数据类型

    引用数据类型因为大小不固定,所以会存在堆内存中,栈内存中存的是堆内存的地址,每次读取值时,先找到栈内存中的内存地址,在通过内存地址,找到在堆内存中的对应的对象。

    栈内存和堆内存的关系图示

    980264-20190322184853956-24584650.png

    参考地址

    posted @ 2019-03-22 18:17 DaivdAndLemon 阅读(...) 评论(...) 编辑 收藏
    展开全文
  • 堆内存和栈内存区别

    万次阅读 2019-03-14 00:03:46
    总结: 1 栈:为编译器自动分配释放,如函数参数、局部变量、临时变量等等 2 堆:为成员分配释放,由程序员自己申请、自己释放。否则发生内存泄露。...栈内存和堆内存区别(一个笔试题的一部分)http://...


    总结:
    1 栈:为编译器自动分配和释放,如函数参数、局部变量、临时变量等等
    2 堆:为成员分配和释放,由程序员自己申请、自己释放。否则发生内存泄露。典型为使用new申请的堆内容。

    除了这两部分,还有一部分是:
    3 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。

    转自:
    栈内存和堆内存的区别(一个笔试题的一部分)http://blog.csdn.net/richerg85/article/details/19175133


    笔试题目:请解释一个栈内存与一个堆内存的区别,请分析下面代码运行是否有问题,如果有问题请改正。

    char* GetMemory(void)

    {

    char p[] = "Hello world";

    return p;

    }

    void main(void)

    {

    char* str = GetMemory();

    printf(str);

    }

    先看第一个问题:栈内存和堆内存的区别

    程序的内存分配
    栈(stack):有编译器自动分配和释放,存放函数的参数、局部变量、临时变量、函数返回地址等;

    堆(heap):一般有程序员分配和释放,如果没有手动释放,在程序结束时可能由操作系统自动释放(?这个可能针对Java那样的有回收机制的语言而说的,对于c/c++,这样的必须要手动释放开辟的堆内存),稍有不慎会引起内存泄漏。

    2.申请后系统的响应

    栈:只要栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则将报异常提示栈溢出。

    堆:在记录空闲内存地址的链表中寻找一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。另外,对于大多数系统会在这块内存空间的首地址出记录本次分配空间的大小,这样代码中的delete 才能正确释放本内存空间。系统会将多余的那部分重新空闲链表中。

    3、申请大小限制
    栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
    堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
    4、分配效率
    栈:由系统自动分配,速度较快。但程序员是无法控制的。
    堆:由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便. 另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活
    5、存储内容

    栈:在栈中,第一个进栈的是主函数下一条指令的地址,然后是函数的各个参数,在大多数编译器中,参数是由右往左入栈,然后是函数中的局部变量。注意,静态变量不入栈。出栈则刚好顺序相反。

    堆:一般在堆的头部用一个字节存放堆的大小,具体内容由程序员安排。

     


    根据《C++内存管理技术内幕》一书,在C++中,内存分成5个区,他们分别是堆,栈,自由存续区,全局/静态存续区,常量存续区。

      a) 栈:内存由编译器在需要时自动分配和释放。通常用来存储局部变量和函数参数。(为运行函数而分配的局部变量、函数参数、返回地址等存放在栈区)。栈运算分配内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

      b) 堆:内存使用new进行分配,使用delete或delete[]释放。如果未能对内存进行正确的释放,会造成内存泄漏。但在程序结束时,会由操作系统自动回收。

      c) 自由存储区:使用malloc进行分配,使用free进行回收。和堆类似。

      d) 全局/静态存储区:全局变量和静态变量被分配到同一块内存中,C语言中区分初始化和未初始化的,C++中不再区分了。(全局变量、静态数据、常量存放在全局数据区)

      e) 常量存储区:存储常量,不允许被修改。

      这里,在一些资料中是这样定义C++内存分配的,可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。

      a)静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。

      b)栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

      c)堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或 delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。

    \
      图3 典型c++内存区域

      总结:C++与C语言的内存分配存在一些不同,但是整体上就一致的,不会影响程序分析。就C++而言,不管是5部分还是3大部分,只是分法不一致,将5部分中的c)d)e)合在一起则是3部分的a)。

     

     

    下面几段代码,则会让你有豁然明白的感觉:
    void fn()

    {

    int* p = new int[5];

    }

      看到new,首先应该想到,我们分配了一块堆内存,那么指针p呢? 它分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。程序会先确定在堆中分配内存的大小,然后调用 operator new分配内存,然后返回这块内存的首地址,放入栈中。

      注意:这里为了简单并没有释放内存,那么该怎么去释放呢? 是deletep么? NO,错了,应该是delete [ ] p,这是告诉编译器:删除的是一个数组。


    //main.cpp
    int a = 0; 全局初始化区
    char *p1; 全局未初始化区
    main()
    {
    int b; 栈
    char s[] = "abc"; 栈
    char *p2; 栈
    char *p3 = "123456"; 123456\0在常量区,p3在栈上。
    static int c =0; 全局(静态)初始化区
    p1 = (char *)malloc(10);
    p2 = (char *)malloc(20);
    分配得来得10和20字节的区域就在堆区。
    strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。

    展开全文
  • java堆内存和栈内存区别

    千次阅读 2015-11-03 14:05:48
    一段时间之前,我写了两篇文章文章分别是Java的垃圾回收Java的值传递,从那之后我收到了很多要求解释Java堆内存和栈内存的邮件,并且要求解释他们的异同点。在Java中你会看到很多堆和栈内存的引用,JavaEE书文章...
  • 通常的操作有入栈(圧)、出栈栈顶元素。想要读取中的某个元素,就要将其之前的所有元素出栈才能完成。类比现实中的箱子一样。 :是一种非连续的树形储存数据结构,每个节点有一个值,整棵树是经过排序的...
  • 在进入讲解主题“-栈内存堆内存区别”之前,先来讲解一下数组,所谓数组,就是若干个相同数据类型的元素按一定顺序排列的集合。 一维数组的定义: 数据类型[ ] 数组名; 数组名 = new 数据类型[个数]; 针对于...
  • 栈内存堆内存区别

    千次阅读 2019-03-06 20:48:45
    ——自动,——手动
  • 栈内存和堆内存Java(详细实例讲解)

    千次阅读 2019-05-02 10:29:19
    栈内存:存放基本类型的变量、对象的引用(引用变量)。(如何回收?) 在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间:当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该...
  • 笔试题目:请解释一个栈内存与一个堆内存区别,请分析下面代码运行是否有问题,如果有问题请改正。 char* GetMemory(void) {  char p[] = "Hello world";  return p; } void main(void) ...
  • JS中对象分为基本类型引用类型,基本类型存放在栈内存,引用类型存放在堆内存。请问栈内存和堆内存区别是什么,为什么这两种对象分别存储在不同的内存中?
  • 浅析Java堆内存和栈内存区别

    万次阅读 2018-03-06 09:36:55
    参考 堆内存:https://baike.baidu.com/item/%E5%A0%86%E5%86%85%E5%AD%98/7270805?fr=aladdin ...Java把内存划分成两种:一种是栈内存,一种是堆内存。 一、栈内存 存放基本类型的变量,对象的引用和方...
  • JAVA之堆内存和栈内存区别

    千次阅读 2018-01-25 12:30:45
    Java把内存分成两种,一种叫做栈内存,一种叫做内存在函数中定义的一些基本类型的变量对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过...
  • 基础知识篇——堆内存和栈内存

    万次阅读 多人点赞 2018-11-01 09:05:00
    数据结构中的堆和栈 是一种连续储存的数据结构,具有先进后出的性质。 通常的操作有入栈(压栈),出栈栈顶元素。想要读取中的某个元素,就是将其之间的所有元素出栈才能完成。 是一种非连续的树形储存...
  • js栈内存和堆内存与垃圾回收机制

    千次阅读 2018-11-04 17:20:34
    栈内存存储基本类型的变量:如Number,String,boolen,undefined,null,以及对对象和数组变量的指针,对象是动态分配内存,数组的初始化方式分为: 动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。 ...
  • 栈内存的一个特点是数据共享,堆内存没有数据共享的特点。
  • 堆内存完全由JVM负责分配释放,如果程序没有缺陷代码导致内存泄露,那么就不会遇到java.lang.OutOfMemoryError这个错误。 使用堆外内存,就是为了能直接分配释放内存,提高效率。JDK5.0之后,代码中能直接操作...
  • 堆内存和栈内存详解

    万次阅读 多人点赞 2014-10-04 17:50:01
    :顺序随意 :先进后出 堆和栈区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。...
  • java虚拟机中栈内存堆内存区别

    千次阅读 2016-12-27 15:27:29
    3、Java针对的操作C++的区别就是,Java不需要在空间不用的时候来显式的释放; 4、Java的是由Java的垃圾回收机制来负责处理的,是动态分配内存大小,垃圾收集器可以自动回收不再使用的内存空间。 5、但缺点...
  • OC中栈和堆内存区别解析

    千次阅读 2017-02-12 12:24:16
    为什么OC对象需要进行内存管理,而其它...OC对象存放于堆里面(堆内存要程序员手动回收),非OC对象一般放在栈里面(栈内存会被系统自动回收);堆里面的内存是动态分配的,所以也就需要程序员手动的去添加内存、回收内存。
  • 内存堆和栈区别

    千次阅读 多人点赞 2019-02-19 16:39:41
    在说堆栈之前,我们先说一下JVM(虚拟机)内存的划分: Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的。...栈内存堆内存。 我们重...
  • java中基本类型在栈内存上,对象在堆内存上,那么,栈内存和堆内存在运行上有什么区别呢?与平常说的运行内存又有什么关系呢?
  • 为什么要有栈内存和堆内存之分

    千次阅读 2018-01-30 17:28:37
    的特点是子节点都比父节点要小,用于动态创建分配内存,创建删除节点的时间复杂度是O(logn)。创建删除的时间复杂 度是O(1),速度更快。  堆栈的出现,源于对内存的优化,你知道,java有垃圾回收,的...
  • 栈内存/堆内存特点

    千次阅读 2017-08-18 09:06:37
    栈内存的特点:栈内存存储的都是局部变量,变量一旦出了自己的作用域,那么马上会从内存小时,释放内存空间。 凡是以new关键字创建的对象,jvm都会在堆内存开辟一个新的空间,创建一个新的对象 堆内存特点:...
  • (1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,...栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 (3) 从上分配,亦称动态内存分配。程序在运行的时候用malloc或new
  • javascript:栈内存堆内存浅谈

    千次阅读 2017-08-03 23:23:19
    javascript的栈内存堆内存

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 321,502
精华内容 128,600
关键字:

栈内存和堆内存的区别