`
jiagou
  • 浏览: 2530638 次
文章分类
社区版块
存档分类
最新评论

C++堆内存空间详解

 
阅读更多

原文:http://see.xidian.edu.cn/cpp/biancheng/view/51.html

堆内存

数组的存储空间必须在程序运行前申请,即数组的大小在编译前必须是已知的常量表达式。空间申请得太大会造成浪费,空间申请得太小会造成数据溢出而使得程序异常。所以,为了解决这个问题,我们需要能够在程序运行时根据实际情况申请内存空间。
在C++中,允许我们在程序运行时根据自己的需要申请一定的内存空间,我们把它称为堆内存(Heap)空间。

申请堆内存

new 数据类型[表达式];
其中,表达式可以是一个整型正常量,也可以是一个有确定值的整型正变量,其作用类似声明数组时的元素个数,所以两旁的中括号不可省略。如果我们只申请一个变量的空间,则该表达式可以被省略,即写作:
new 数据类型;

释放堆内存

当一个程序运行完毕之后,它所使用的数据就不再需要。由于内存是有限的,所以它原来占据的内存空间也应该释放给别的程序使用。对于普通变量和数组,在程序结束运行以后,系统会自动将它们的空间回收。然而对于我们自己分配的堆内存空间,大多数系统都不会将它们回收。如果我们不人为地对它们进行回收,只“借”不“还”,那么系统资源就会枯竭,电脑的运行速度就会越来越慢,直至整个系统崩溃。我们把这种只申请空间不释放空间的情况称为内存泄露(Memory Leak)。

确认申请的堆内存空间不再使用后,我们用delete操作符来释放堆内存空间,其语法格式为:
delete [] 指向堆内存首元素的指针;
如果申请的是一个堆内存变量,则delete后的[]可以省略;如果申请的是一个堆内存数组,则该[]不能省略,否则还是会出现内存泄露。另外,我们也不难发现,delete后的指针就是通过new获得的指针,如果该指针的数据被修改或丢失,也可能造成内存泄露。

实例

#include "iostream.h"
int main()
{
    int size;
    float sum=0;
    int *heapArray;
    cout <<"请输入元素个数:";
    cin >>size;
    heapArray=new int[size];
    cout <<"请输入各元素:" <<endl;
    for (int i=0;i<size;i++)
    {
        cin >>heapArray[i];
        sum=sum+heapArray[i];
    }
    cout <<"这些数的平均值为" <<sum/size <<endl;
    delete [] heapArray;
    return 0;
}


可见,申请的堆内存数组在使用上和一般的数组并无差异。我们需要记住的是,申请了资源用完了就一定要释放,这是程序员的好习惯,也是一种责任。

<br />本文来自【C语言中文网】:<a href="http://see.xidian.edu.cn/cpp/biancheng/view/51.html" target="_blank">http://see.xidian.edu.cn/cpp/biancheng/view/51.html</a>可见,申请的堆内存数组在使用上和一般的数组并无差异。我们需要记住的是,申请了资源用完了就一定要释放,这是程序员的好习惯,也是一种责任。

分享到:
评论

相关推荐

    C++程序内存分配讲解

    讲解目录 1、问:程序运行需要哪些空间?答:栈区、堆区、常量区等。 2、问:动态空间如何使用?答:通过指针 3、问:常量一定是在常量区吗?答:不一定 4、问:宏定义的常量是怎么...10、问:内存如何对齐?答:少对多

    堆内存和栈内存详解 ESP

    一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈 2、堆区(heap) — 一般由程序员分配释放, 若...

    C++中静态存储区与栈以及堆的区别详解

    学习c++如果不了解内存分配是一件非常可悲的事情。而且,可以这样讲,一个C++程序员无法掌握内存、无法了解内存,是不能够成为一个合格的C++程序员的。一、内存基本构成可编程内存在基本上分为这样的几大部分:静态...

    C++对象内存分布详解(包括字节对齐和虚函数表)

    也不需要关心自己是否从其他类派生,只要按照一个统一的流程:在自身的构造函数执行之前把自己所属类(即当前构造函数所属的类)的虚函数表的地址绑定到当前对象上(一般是保存在对象内存空间中的前4个字节)。...

    详解C++ 动态内存分配与命名空间

    1、C++中的动态内存分配 通过new关键字进行动态内存申请 C++中的动态内存申请时基于类型进行的 delete关键用于内存释放 ... // 从堆空间获取一个新的Type类型的空间 // 使用和C语言一样 delete

    c++动态分配内存

    对于c++动态分配内存问题对于初学者来说是一件很头痛的事,本文档详细讲述该类问题,令初学者恍然大悟!其实非常简单1

    基于 c++实现 内存管理 - 动态分区分配方式模拟 代码详解教程

    模拟一个作业的执行过程,该作业有320条指令,即它的地址空间为32页,目前所有页还没有调入内存。 功能描述 在模拟过程中,如果所访问指令在内存中,则显示其物理地址,并转到下一条指令;如果没有在内存中,则发生...

    深入理解C++11:C++11新特性解析与应用

    1555.1 强类型枚举 1555.1.1 枚举:分门别类与数值的名字 1555.1.2 有缺陷的枚举类型 1565.1.3 强类型枚举以及C++11对原有枚举类型的扩展 1605.2 堆内存管理:智能指针与垃圾回收 1635.2.1 显式内存管理 1635.2.2 ...

    C++11unique-ptr智能指针详解.pdf

    和 shared_ptr 指针最⼤的不同之处在 于,unique_ptr 指针指向的堆内存⽆法同其它 unique_ptr 共享,也就是说,每个 unique_ptr 指针都独⾃拥有对其所指堆内存空间的所有 权。 这也就意味着,每个 unique_ptr 指针...

    C++智能指针-unique-ptr智能指针详解.pdf

    C++智能指针 智能指针_unique_ptr智能指针详解 智能指针详解 作为智能指针的⼀种,unique_ptr 指针⾃然也具备"在适当时机⾃动释放堆内存空间"的能⼒。和 shared_ptr 指针最⼤的不同之处在 于,unique_ptr 指针指向的...

    C++11unique-ptr智能指针详解(1).pdf

    和 shared_ptr 指针最⼤的不同之处在 于,unique_ptr 指针指向的堆内存⽆法同其它 unique_ptr 共享,也就是说,每个 unique_ptr 指针都独⾃拥有对其所指堆内存空间的所有 权。 这也就意味着,每个 unique_ptr 指针...

    C++智能指针详解(1).pdf

    C++智能指针详解 1、概述 我们知道除了静态内存和栈内存外,每个程序还有⼀个内存池,这部分内存被称为⾃由空间或者堆。程序⽤堆来存储动态分配的对象即那些 在程序运⾏时分配的对象,当动态对象不再使⽤时,我们的...

    C/C++ 中堆和栈及静态数据区详解

    C/C++ 中堆和栈及静态数据区详解  五大内存分区  在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。下面分别来介绍:  栈,就是那些由编译器在需要的时候分配,在不需要的...

    c++类构造函数详解

    /* 类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数-&gt;由构造函数完成成员的初始化工作 eg: Counter c1;  编译系统为对象c1的每个数据成员(m_value)分配内存空间,并调用构造函数Counter( )自动...

    java堆栈的区别 -- 详解

    会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的...

    C++ 中指针和引用有什么区别详解

    1.从内存上来讲 系统为指针分寸内存空间,而引用与绑定的对象共享内存空间,系统不为引用变量分配内容空间。 2指针初始化以后可以改变指向的对象,而引用定义的时候必须要初始化,且初始化以后不允许再重新绑定对象...

    C++之异常处理详解

    而运行时的错误则不容易修改,因为其中的错误是不可预料的,或者可以预料但无法避免的,比如内存空间不够,或者在调用函数时,出现数组越界等错误。如果对于这些错误没有采取有效的防范措施,那么往往会得不到正确的...

    C\C++ 获取当前路径实例详解

     参数:buffer是指将当前工作目录的绝对路径copy到buffer所指的内存空间, len是buffer的长度。  返回值:获取成功则返回当前工作目录(绝对路径),失败则返回false(即NULL)。  该函数所属头文件为 具体使用...

    C++表达式new与delete知识详解

    在C++中,new表达式用于动态创建对象,即在堆(自由存储区)空间上为对象分配内存,而程序员也要小心的使用这些申请来的内存空间,当不再使用时应该调用delete表达式来释放该存储空间并且将指针置零。 本文学习了...

Global site tag (gtag.js) - Google Analytics