在之前我们所写过的程序中,所必需的内存空间的大小都是在程序执行之前就已经确定了。但如果我们需要内存大小为一个变量,其数值只有在程序运行时 (runtime)才能确定,例如有些情况下我们需要根据用户输入来决定必需的内存空间,那么该怎么办呢?
  答案是动态内存分配(dynamic memory),为此C++ 集成了操作符new 和delete。
  1.  new 和new [] 操作符
  动态内存分配用操作符 new 。new 后面跟一个数据类型,如果要求的元素多于一个,需要加上 [],元素数量放在 [] 中。它返回一个指向内存块开始位置的指针。语法是:
  pointer = new type
  pointer = new type [number_of_elements]
  第一个表达式为数据类型为 ‘type’ 的一个元素分配内存地址。第二个表达式为数据类型为 ‘type’ 的一组元素分配一块内存,其中 number_of_elements 是整数型,表示元素的个数。例如:
  int* foo;
  foo = new int[5];
  在这个例子里,操作系统分配了可存储5个整型int元素的内存空间,返回指向这块空间开始位置的指针并将它赋给foo。因此,现在foo 指向一块可存储5个整型元素的合法的内存空间,如下图所示。

  这里,foo 是一个指针,foo指向的第一个元素可以通过语句 foo[0] 或 *foo 得到,两者是等价的。第二个元素可以通过语句 foo[1] 或 *(foo+1) 得到,一次类推......
  那么刚才所作的给指针分配内存空间与定义一个普通的数组有什么不同呢?最重要的不同是,一个普通数组的长度必须是一个常量,这就将它的大小在程序执行之前就被决定了。而采用动态内存分配时,数组的长度可以常量或变量,其值可以在程序执行过程中再确定 www.yztrans.com
  动态内存分配通常由操作系统控制,在多任务的环境中,它可以被多个应用(applications)共享,因此内存有可能被用光。如果这种情况发生,操作系统将不能在遇到操作符new 时分配所需的内存,一个空值指针(null pointer)将被返回。
  C++ 提供两种标准机制来检查内存是否分配成功:
  (1)处理异常。
  这种方法,当内存分配失败时,会抛出一个 bad_alloc 类型的异常。然后程序被终止。
  这个方法是默认使用 new 时具有的异常方法,也就是:
  foo = new int[5];
  (2)使用 nothrow 。
  当内存分配失败时,它不抛出异常 或 终止程序,而是被 new 返回一个空值指针,程序照常执行。
  nothrow 是一个在头文件 中被声明的特殊对象,作为 new 的参数:
  foo = new (nothrow) int[5];
  当分配内存时,可以检查 foo 的值,若是 空值指针 null pointer 则是分配失败:
  int* foo;
  foo = new (nothrow)int[5];
  if (foo == nullptr){//采取的措施}
  2.  delete 和delete[] 操作符

  大部分情况下,动态分配的内存只在程序运行的具体的阶段内才有用,一旦它不再被需要,就要被释放掉,以便后面的内存分配能够使用。这就用到了delete 操作符。语法:
  delete pointer;
  delete []pointer;
  第一种表达形式用来删除给单个元素分配的内存,第二种表达形式用来删除多元素(数组)的内存分配。在多数编译器中两种表达式等价,使用没有区别, 虽然它们实际上是两种不同的操作,需要考虑操作符重载overloading. www.tygj123.com
  #include
  #include //不写vs2010不会报错
  using namespace std;
  int main{
  int i ,n;
  int* p;
  cout<<"How many numbers would you like to type ? "
  cin>>i;
  p = new (nothrow)int [i];  //根据用户输入动态分配内存
  if (p == nullptr)  //检查内存是否分配成功
  {cout<<"Error: member could not be allocatec!"}
  else
  {
  for(n = 0; n < i; n++)
  {
  cout<<"Enter number :";
  cin>>p[n];
  }
  cout<<"You have entered :"
  for(n = 0; n < i; n++)
  {
  cout<

动态内存分配(new)和释放(delete)的更多相关文章

  1. c/c++动态内存分配的区别

    c中动态内存分配使用malloc和free. malloc指定需要分配的内存大小,分配成功则返回指向该内存的指针,不成功则返回空指针.返回的指针类型为void *,表示不确定指针所指内存存放的数据类型 ...

  2. [008]new、delete及动态内存分配

    1.new和delete都会用,这里只声明一点: C++ 没有明确定义如何释放指向不是用 new 分配的内存地址的指针. 比如下面的代码: #include<iostream> using ...

  3. 布尔类型、操作符别名、C++函数、动态内存分配(new\delete)、引用(day02)

    六 C++的布尔类型 bool类型是C++中基本类型,专门表示逻辑值:true/false bool在内存上占一个字节:1表示true,0表示false bool类型可以接收任意类型和表达式的结果,其 ...

  4. C++ 自学笔记 new和delete(动态内存分配)

    动态内存分配 Dynamic memoey allocation C++使用new和delete 来申请和释放内存 new:先申请一个空间 int\Stash : 默认构造函数初始化对象 ~:析构函数 ...

  5. C++指针和动态内存分配

    指针和动态内存分配 数组与指针 数组 数组名是一个指针常量. 数组名传递数据时,传递的是地址. 数组作为函数参数时不指定第一维大小. 对象数组 A a[2] = {A(1,2)}; 执行时先调用有参数 ...

  6. c++内存分配(new和delete)

    c中malloc和free是函数,包含在stdlib.h头文件中,分配成功返回指针,失败返回空指针. 与new的区别是: 1,malloc与free是C++/C语言的标准库函数,new/delete是 ...

  7. C++动态内存分配

    C++动态内存分配1.堆内存分配 :C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念:通常定 ...

  8. C++二维数组动态内存分配

    对于二维数组和二维指针的内存的分配 这里首选说一下一维指针和一维数组的内存分配情况. 一维: 数组:形如int  a[5];这里定义了一个一维数组a,并且数组的元素个数是5,这里的a是这五个元素的整体 ...

  9. C++学习笔记(十一):void*指针、类型转换和动态内存分配

    void*指针 void关键字表示“空类型”的概念.但是,这里的“空类型”不表示“任意类型”,而是表示不存在的意思,也就是说C/C++不允许你写语句void a,不存在类型为void的东西. void ...

随机推荐

  1. 字符串(后缀自动机):NOI 2016 优秀的拆分

    [问题描述] 如果一个字符串可以被拆分为 AABB 的形式,其中 A 和 B 是任意非空字符串, 则我们称该字符串的这种拆分是优秀的. 例如,对于字符串 aabaabaa,如果令 A = aab, B ...

  2. 【模拟】Codeforces 691A Fashion in Berland

    题目链接: http://codeforces.com/problemset/problem/691/A 题目大意: n个数0或1,要求恰好n-1个1,如果n为1则那个数一定要是1 题目思路: [模拟 ...

  3. 2012 A 《中国近现代史纲要》课程期末考试试卷

    湖南人文科技学院2012—2013学年第1学期公共课 2011级<中国近现代史纲要>课程期末考试试卷 考核方式:(开卷)                                   ...

  4. python 代码格式化工具:YAPF

    学习资料: https://github.com/google/yapf 背景 现在的大多数 Python 代码格式化工具(比如:autopep8 和 pep8ify)是可以移除代码中的 lint 错 ...

  5. M - 昂贵的聘礼 - poj1062

    Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低 ...

  6. hdoj 1513 Palindrome【LCS+滚动数组】

    Palindrome Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  7. Spring 配置中的 default-lazy-init属性

    spring的容器是提供了lazy-load的,即默认的缺省设置是bean没有lazy-load,该属性处于false状态,这样导致spring在启动过程导致在启动时候,会默认加载整个对象实例图,从初 ...

  8. 什么是mata标签

    <meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. <meta> 标签位于文档的头部,不包含任何内容.&l ...

  9. AFNetworking (3.1.0) 源码解析 <六>

    这次继续介绍文件夹Serialization下的类AFURLResponseSerialization.这次介绍就不拆分了,整体来看一下.h和.m文件. 协议AFURLResponseSerializ ...

  10. Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等

    本文属于原创,转载请著名出处:http://flysnow.iteye.com/blog/906770 写道 在我们开发一些如短消息.应用商店等应用时,会考虑在短消息的图标上加上未读短信的数量,在应用 ...