Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104610
  • 博文数量: 25
  • 博客积分: 514
  • 博客等级: 下士
  • 技术积分: 690
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-07 01:22
个人简介

漂泊海外的游子

文章分类

全部博文(25)

文章存档

2015年(2)

2013年(1)

2012年(22)

分类: C/C++

2012-02-19 00:01:29

有句名言,存在即是合理的。
今天说说动态内存。我们知道我要处理任何数据,都要将数据放进内存中,然后处理。先前声明的变量就是用来分配内存给数据的。但是,对于一些计算,开始并不知道要多大的内存,运行的时候才知道,这该怎么办?这就要动态内存帮忙了。

1. 操作符 new 和new[]

如何在运行时获得内存呢?用new就可以了。如果你需要的内存大于一个元素,那就用new[]。它们将返回一个指针,这个指针指向内存模块的开始处。例如:

int * bobby;
bobby = new int [5];

这样获取第一个元素即可以用bobby[0]也可以用*bobby。第二个元素可以用bobby[1]或(*bobby+1),以此类推。

常规数组和动态数组的最大区别就是,常规数组的大小是死的,是个常量,动态数组是可以改变的。也就为数据处理带来了很多的灵活性。因为有时候你还真不知道你能得到多大的数组。

但是内存毕竟是有限的,如何判断时候还有内存给数组呢?
两种方法
a, bad_alloc
这个是操作符new默认的方法。当你内存分配失败的时候,将会有bad_alloc类型的异常被抛出来。程序停止运行。

b. nothrow
这个不会出现异常当内存分配失败,也不会终止程序,只会返回一个null指针。然后程序继续进行。声明像这样:
bobby = new (nothrow) int [5];

2. 操作符delete和delete[]
既然能分配内存,也应该要收回内存。内存资源宝贵,用完了,也要给别人用嘛(程序)。delete 可以回收单个元素的内存,delete[]回收数组的内存。
delete pointer;
delete[] pointer;
这里说明,传递给delete必须是指针或者是null指针。

给个例子
  1. #include <iostream>
  2. #include <new>
  3. using namespace std;

  4. int main () {

  5.   int i,n;
  6.   int *p;
  7.   cout<<"How many numbers would you like to type?";
  8.    cin>>i;
  9.   p = new (nothrow) int[i];
  10.   if (p == 0)
  11.    cout<<"Error: memory could not be allcoated";
  12.    else {
  13.     for(n=0;n<i;++n) {
  14.        cout<<"Enter number: ";
  15.        cin >> p[n];
  16.         }
  17.         cout<<"You have entered: ";
  18.      for (n=0;n<i;++n)
  19.           cout<<p[n]<<", ";
  20.          delete[] p;                       //释放内存    
  21.    }
  22. return 0;
  23. }

最后想说,内存管理很重要。
下次见



阅读(1204) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~