在之前我们所写过的程序中,所必需的内存空间的大小都是在程序执行之前就已经确定了。但如果我们需要内存大小为一个变量,其数值只有在程序运行时 (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. vijos1053Easy sssp

    P1053Easy sssp 描述 输入数据给出一个有N(2 <= N <= 1,000)个节点,M(M <= 100,000)条边的带权有向图. 要求你写一个程序, 判断这个有向图 ...

  2. POJ 2289 Jamie's Contact Groups(多重匹配+二分)

    题意: Jamie有很多联系人,但是很不方便管理,他想把这些联系人分成组,已知这些联系人可以被分到哪个组中去,而且要求每个组的联系人上限最小,即有一整数k,使每个组的联系人数都不大于k,问这个k最小是 ...

  3. 动态规划(斜率优化):BZOJ 1010 【HNOI2008】 玩具装箱

    玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8218  Solved: 3233[Submit] Description P 教授要去 ...

  4. kafka消息监控-KafkaOffsetMonitor

    参照site:https://github.com/quantifind/KafkaOffsetMonitor 一.简述 这个应用程序用来实时监控Kafka服务的Consumer以及它们所在的Part ...

  5. MD5加密详解

    MD5加密详解 引言: 我在百度百科上查找到了关于MD5的介绍,我从中摘要一些重要信息: Message Digest Algorithm MD5(中文名为信息摘要算法第五版)为计算机安全领域广泛使用 ...

  6. 一个urllib2构建的html下载器的代理组件的实现方案

    调用栈/函数链如下: 情形一:下载器初始化时 __init__ buildOpener#构建opener newProxy4Opener#装备代理 getNewProxy#获取代理 maintainP ...

  7. Git git rebase 使用

      原文:http://gitbook.liuhui998.com/4_2.html 一.基本 git rebase用于把一个分支的修改合并到当前分支. 假设你现在基于远程分支"origin ...

  8. 使用Linux的命令行工具做简单的文本分析

    Basic Text Analysis with Command Line Tools in Linux | William J Turkel 这篇文章非常清楚的介绍了如何使用Linux的命令行工具进 ...

  9. HDU4530:小Q系列故事——大笨钟

    Problem Description 饱尝情感苦恼的小Q本打算隐居一段时间,但仅仅在3月25号一天没有出现,就有很多朋友想念他,所以,他今天决定再出来一次,正式和大家做个告别. 小Q近来睡眠情况很差 ...

  10. PHP 函数的“引用返回”概念释疑(转)

    很多时候我们会看到这样的代码(出自 CI 框架源码): 1 $class =& load_class('a','b'); 我们都知道其中的'&'是指引用,但是它的作用是什么呢?它能够解 ...