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

    原文网址:http://jingyan.baidu.com/article/647f0115b031887f2048a85a.html?qq-pf-to=pcqq.group 今天打算删除一个仓库重新 ...

  2. 【并查集】【模拟】Codeforces 698B & 699D Fix a Tree

    题目链接: http://codeforces.com/problemset/problem/698/B http://codeforces.com/problemset/problem/699/D ...

  3. HDOJ 2014 青年歌手大奖赛_评委会打分

    Problem Description 青年歌手大奖赛中,评委会给参赛选手打分.选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分. Input 输入数据有多组,每组占 ...

  4. FTP软件Filezilla出现“读取目录列表失败”的解决办法

    FTP软件Filezilla出现“读取目录列表失败”情况一般出现在vista/win7系统上,之前在xp上没发现这种情况. 总的来说,不论是打开FTP出现乱码或者显示“读取目录列表失败”均是由字符集引 ...

  5. 手机app

    手机app是什么? 由于iPhone.三星等智能手机的逐步流行和广泛普及,手机app这个词语开始频繁的出现在广大手机网民的视线中.也许你们还不知道什么是手机app,但你一定下载过手机app,你的手机里 ...

  6. [Locked] Binary Tree Longest Consecutive Sequence

    Binary Tree Longest Consecutive Sequence Given a binary tree, find the length of the longest consecu ...

  7. nat模式、路由模式,网桥模式

    路由器的几种连接方式 NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Fo ...

  8. Spring MVC返回对象JSON

    @RestController 用于返回对象,会自动格式化为JSON     @RequestMapping("/user2")     public User2 user2(Mo ...

  9. Genymotion开始搞起~

    简介 一:什么是GenymotionGenymotion是一款完全超越BlueStacks的安卓模拟器,正如它中文官网的介绍:快到极致的Android模拟器.英文官网:http://www.genym ...

  10. Windows7下32位IE异常不能打开解决方法

    今天更新了Update及安装了一些软件,重启电脑后发现32位IE不能正常打开,而64位IE正常. 错误信息如下: 问题签名:  问题事件名称: BEX  应用程序名: iexplore.exe  应用 ...