第二十一讲 资源管理

       为什么说C/C++是不安全的呢?因为他们都直接在内存上操作,稍有不慎就会漏洞百出,不论是数组越界还是内存泄漏都是一些极为棘手的问题,稍微短小的代码还好排错,要是几万行的代码怎么处理?所以资源管理不管是C还是C++都极为重要,要做一个合格的程序员,就要能够管理内存资源。说到内存管理,今天不得不说的两个函数就是上次我们说到的malloc()和free()了。
———————————–
double * ptr;


ptr = (double*)malloc(50*sizeof(double));


————————————-
这段代码请求 30 个 double 类型值的空间, 并且把 ptr 指向该空间的所在位置。
注意 ptr 是作为指向一个 double 类型值的指针声明的,而不是指向 50个 double 类型值的数据块的指针。
记住: 数组的名字是它第一个元素的地址, 因此,如果我们令 ptr指向一个内存块的第一个元素,就可以像使用数组名一样使用它。也就是说,可以使用表达式 ptr[0] 来访问内存块的第一个元素,ptr[1] 来访问第二个元素, 依此类推。正如前面所学,可以在指针符号中使用数组名,也可以在数组符号中使用指针。
说到这里,我们好像发现声明一个数组的方式似乎有两种了,哪两种呢?我们现在来理一理:
1. 声明一个数组,声明时用常量表达式指定数组维数,然后可以用数组名访问数组元素。
2. 声明一个指针, 调用 malloc(),然后使用该指针来访问数组元素。
用第二种方式,既是用malloc可以做一些用普通的数组声明做不到的事:创建一个动态数组 (dynamicarray),即一个在程序运行时才分配内存并可在程序运行时选择大小的数组. 例如, 假定 n 是一个整数变量. 在 C99 之前, 不能这样做:
double array[n];

  
如果 n 是一个变量, c99 之前不允许这样做,就算是现在的VS2012也不支持这么写,不过GCC支持。
然而, 即使在 c99 之前的编译器中,如果想要申请一个变量数组,我们可以这样做:
ptr = (double *) malloc (n * sizeof(double));

 
是不是发现这种方式很有用吗?动态创建的好处是对资源的利用,下面是一个更为普通的使用方法:
————————————-
T* ptr;
      ptr = (T*)malloc(sizeof(T)*n);


————————————-
T表示类型,在malloc面前的这个T可有可无,在C里面是这样的,不过在C++里就必须要有,所以为了和C++兼容,我们还是把他带上。
当然,在结束使用之后,记得使用free()将资源释放。free()参数就是要释放的内存,如果我们使用完ptr后,我们就用free将他释放掉:free(ptr)即可。
malloc的参数就是我们想要的内存大小,为了不至于内存泄漏,为了不至于数组越界,所以我们就得更好的利用这个函数去动态分配内存。
和malloc一样,calloc也是动态分配内存的函数,该函数和malloc的用法有些不一样,如果我们用calloc来修改上面的定义就得这样写了:
———————————-
double* ptr;
ptr = (double*)calloc(50,sizeof(double));
————————————-
其中端倪就留给大家去探索了,calloc同样可以用free来释放内存。
关于C/C++的五种储存类型就留待大家去探索吧,我就不打算说了。明天我们说文本文件的操作吧。

发表评论