`

堆和栈(一)

    博客分类:
  • C++
阅读更多
1、内存分配方式有三种:
(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量
(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,

但是分配的内存容量有限
(3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使

用非常灵活,但问题也最多

2、常见的内存错误及其对策
(1)内存分配未成功,却使用了它
编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用

assert(p!=NULL)进行检查。如果是用malloc或new来申请内存,应该用if(p==NULL)或if(p!=NULL)进行防错处理
(2)内存分配虽然成功,但是尚未初始化就引用它
犯这种错误主要有两个起因:一是没有初始化的观念;二是误以为内存的缺省初值全为零,导致引用初值错误(例如数组)。内存的缺省初值究竟是什么并没有统一的标准,尽管有

些时候为零值。所以无论用何种方式创建数组,都别忘了赋初值,即便是赋零值也不可省略
(3)内存分配成功并且已经初始化,但操作越过了内存的边界
例如在使用数组时经常发生下标“多1”或者“少1”的操作。特别是在for循环语句中,循环次数很容易搞错,导致数组操作越界
(4)忘记了释放内存,造成内存泄露
分享到:
评论

相关推荐

    堆和栈总结

    堆栈(stack),堆(heap) Java堆栈 jvm为每个新创建的线程都分配一个堆栈。堆栈以帧为单位保存线程的状态。jvm对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。

    浅析C语言中堆和栈的区别

    在计算机领域,堆栈是一个不容忽视的概念,我们编写的...C语言程序经过编译连接后形成编译、连接后形成的二进制映像文件由栈,堆,数据段(由三部分部分组成:只读数据段,已经初始化读写数据段,未初始化数据段即BBS)

    堆和栈的区别——软件常识

    堆和栈的区别 软件常识,面试必备,要想真正理解里面的含义,还得实际做一段时间的程序才能理解

    嵌入式编程中的堆和栈

    本文系统讲述了嵌入式系统编程中堆和栈的知识,让你有一个清晰的认识。

    JAVA中堆和栈的概念

    声明变量是在栈空间开辟了一个位置,实例化之后才会开辟一个堆空间 被赋予空值的话则是将栈空间地址指向一个新的堆空间位置

    堆和栈的区别可以用如下的比喻来看出

    堆和栈的区别,知道堆和栈的使用以及区别,在工作注意事项。

    堆和栈的区别

    堆和栈的区别 一、预备知识—程序的内存分配 二、堆和栈的理论知识 三、windows进程中的内存结构

    Java中堆和栈的区别

    Java把内存划分成两种:一种是栈内存,一种是堆内存。 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量...

    C++堆和栈的区别与联系讲解

    C++中,内存分为5个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区。通常存放局部变量、函数参数等。 堆:是由new分配的内存块,由程序员...

    堆和栈详细,编程必知

    在计算机领域,堆栈是一个不容忽视的概念,我们编写的语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。

    堆与栈的区别

    3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另 一块区域。 - 程序结束后由系统释放。 4、...

    堆与栈的那些故事

    堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,...

    Java中堆内存与栈内存分配浅析

    本文分析了Java中堆内存与栈内存分配的异同

    Java的内存机制(堆和栈)简单理解

    偶然看到一道面试题,Java在实例化一个类的时候,数据在堆和栈中是如何存放的?  public class A{  public int i=1;  public static A a1 = new A();  public static void mian(String args[]){  int c = ...

    堆和栈区别.pdf

    局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一 块区域。 - 程序结束后有系统释放 4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放...

    堆(heap)和栈(stack)的区别

    一、预备知识—程序的内存分配 二、例子程序 3.windows进程中的内存结构

    堆内存和栈内存详解 ESP

    3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字...

    深入堆与栈 堆与栈的区别

    Java的堆是一个运行时数据区,对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式地释放···

    C++中堆和栈的区别

    堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈。

Global site tag (gtag.js) - Google Analytics