内存管理函数(C++学习笔记 14)

一、C语言中的内存管理函数

  • 内存分配函数主要有malloc( )和calloc( ),内存释放函数是free( )。
  • 这两类函数的原型在stdlib.h中,要使用这些函数时,首先要用文件包含:
    #include"stdlib.h" 或#include<stdlib.h>
1、内存分配函数malloc( )

函数原型:void *malloc(int size);
例子:

int *pi1,*pi2;
pi1=(int *)malloc(sizeof(int));  //分配2字节,即整型数据长度
pi2=(int *)malloc(sizeof(int)*100);  //分配200字节

注意:malloc只进行内存分配,并不能对所得的内存进行初始化,因此分配的内存单元存储的是随机值。

2、内存块分配函数calloc( )

函数原型:void *calloc(unsigned n, unsigned size);
例子:

int *pi;
pi = (int *)calloc(10,2);  //分配10块大小为2字节的内存空间
pi = (int *)malloc(20);  //两者等价
3、内存释放函数free( )

函数原型:void free(void *block);
例子:

int *pi;
pi = (int *)malloc(4);  //分配4字节的内存空间
*pi = 100;
free(pi);
pi=(int *)malloc(sizeof(int)*100);
free(pi);

二、C++中的内存管理函数

  • C++使用运算符new和delete进行内存的分配和释放。但是为了与C语言兼容,C++仍保留了malloc和free这两个函数。
1、内存分配
  • 运算符new用于内存分配的最基本形式为:指针变量名=new 类型;
    例如,
   int *p = new int;
   //或者
   int *p;
   p = new int;
  • 运算符new从称为堆的一块自由存储区中为程序分配一块与类型字节数相适应的内存空间,并将该块内存的首地址存于指针变量中。
  • 补充 1:使用new可以为数组动态分配内存空间,这时需要在类型名后面缀上数组大小,例如:new为具有10个数组元素的整型数组分配了内存空间,并将其首地址赋给了指针pi。
int *pi=new int[10];   //动态分配10个整型内存空间

例子:

#include<iostream>
#include<string>
using namespace std;
int main(){
    float *d=new float[3];
    d[0]=3;
    d[1]=6;
    d[2]=9;
    for(int i=0;i<3;i++,d++){
    	cout<<"d[0]="<<d[0]<<endl;
	}
	return 0;
}

结果为:
在这里插入图片描述

  • 补充 2:new可在为简单变量分配内存的同时,进行初始化。其基本形式为:指针变量名=new 类型(初值);
    例如:int *p = new int(99);
  • 补充 3:使用new动态分配内存时,若没有足够的内存满足分配要求,则动态分配空间失败,有些编译系统将返回空指针NULL,因此可以对 内存的动态分配是否成功进行检查:
    例子:对动态分配是否成功进行检查。
#include<iostream>
using namespace std;
int main(){
	int *p=new int;
	if(!p){
		cout<<"allocation failure!\n"<<endl;
		return 1;
	}
	*p=20;
	cout<<*p;
	delete p;
	return 0;
}
  • 补充 4:用new分配的存储空间不会自动释放,只能通过delete释放。因此要适时释放动态分配的存储空间。
2、内存释放
  • 运算符delete用于释放运算符new分配的存储空间。该运算符释放存储空间的基本形式为:delete 指针变量名;
  • 释放动态分配的数组存储区时,可使用如下的delete格式:delete []指针变量名;
    注意:在此指针变量名前只用一对方括号,无需指出所删除数组的维数和大小。
3、使用new和delete的简单例子。
#include<iostream>
using namespace std;
int main(){
	int *ptr;
	ptr=new int;
	*ptr=10;
	cout<<*ptr;
	delete ptr;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/aaqian1/article/details/83717529