malloc()函数与new操作符 -- C++复习--钱能-第3版

1.堆内存

有时,程序在运行中需要动态获取内存空间,这种内存需求随着程序运行的进展而时大时小,这种运行中申请的内存就是堆内存,所以堆内存是动态的。堆内存也称动态内存。

堆(heap)是内存空间。堆是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时(而不是在编译时)申请某个大小的内存空间。

使用malloc()函数和new操作符分别是C程序和C++程序中动态申请空间的一种方法。(C++程序在引入头文件后也可使用malloc函数)。

2.malloc()和free()函数

函数malloc()是C程序获得堆内存的一种方法,它在stdlib.h或cstdlib头文件中声明。函数原型为:void *malloc(unsigned int size); 

从函数原型可以得知,函数参数为空间大小(单位为字节),返回内容是指向所申请内存的地址。该内存中的内容是未知的。返回类型为void* ,void* 表示未确定类型的指针。因此,在申请空间时要根据实际需求将返回结果强制转换成对应类型。

由于程序并没有保证一定可以从堆中获得所需内存。有时,系统能提供的堆空间不够分配,这时系统会返回一个空指针值NULL,表示申请失败。

程序在运行中可能经常会不再需要由malloc()函数分配的内存,这时就需要使用free()函数把先前所占用的内存释放回堆以供程序的其他部分使用。函数原型为:void free(void *);

实例如下:

#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
	int len;
	cout<<"请输入数组长度: ";
	cin >> len;	
	int* nums = (int*)malloc(len * sizeof(int));    // 定义指针、申请空间
	if(!nums)	exit(1);                            // 判断是否申请到内存空间
	for(;len > 0; len --)  
		cout<<( nums[len-1] = len*2+1 )<<(len == 1 ? "\n" : " "); // 赋值并逆序输出
	free(nums);                                     // 释放空间
	system("pause");
} 
malloc()函数与new操作符 -- C++复习--钱能-第3版
运行结果

3. new与delete

new和delete是C++专有的操作符,它们不用头文件声明。new分配堆内存,比malloc()更简练。new的操作数为数据类型,它可以带初始化值表或单元个数。new返回一个具有操作数的数据类型的指针,即表示无需强制转换。delete类似于函数free(),释放堆内存。delete的操作数是new返回的指针,当返还的是new分配的数组时,应该带[]。

#include<iostream>    // new和delete无需头文件
using namespace std;
int main(){
	int len;
	cout<<"请输入数组长度: ";
	cin >> len;	
	int* nums = new int [len];    // new分配内存
	if(!nums)	exit(1); 
	for(;len > 0; len --)  
		cout<<( nums[len-1] = len*2+1 )<<(len == 1 ? "\n" : " ");
	delete[] nums;                // delete释放内存
	system("pause");
} 

 

 

上一篇:TDA4 RTOS内存分配(c:malloc,c++:new)


下一篇:CS61C Project1