C++动态内存的分配、使用、释放以及内存泄漏
上节我们介绍了为什么要使用动态内存。C++之为什么要使用动态内存分配
本节我们讲方法。
-
在开发过程中,我们经常需要使用动态内存分配和撤销内存空间,特别是数据结构中节点的插入和删除。在C语言中是利用库函数
malloc
和free
来分配和撤销内存空间的,C++提供了较简便而且功能较强的运算符new
和delete
来取代malloc
和free
函数。 -
注意:
new
和delete
不是函数,是运算符,因此效率高! -
为了与C兼容,C++仍然保留
malloc
和free
函数,但不建议使用。 -
例子:
new int;
//开辟一个存储整数的空间,返回空间的地址。new int(10);
//开辟一个存储整数的空间并且指定整数的初值为10,返回空间的地址。new int[100];
//开辟一个能存放100个int元素的空间,返回空间的首地址。new int[3][4];
//开辟一个二维数组大小为3行4列,返回空间的首地址。
-
new格式:
new运算符 动态内存分配。
指针变量 = new 类型(常量);
指针变量 = new 类型[表达式];
指针变量 = new 类型[表达式][表达式];
作用: 从堆上分配一块指定类型,指定大小的空间,并且返回空间的首地址!
注意: 第一个方式中常量是初始化值, 可以缺省。创建数组时,无法指定初始值。 -
delete格式:
delete运算符 释放已经分配的内存空间。
使用方式: delete 指针变量;
注意: delete的指针变量,必须是new分配过的指针! -
例:
#include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; int main() { //第一种方式 int* a = new int(4); //第二种方式 int* b = new int[10]; //也可以用malloc delete[] b;//也可以用free(b); b = (int*)malloc(10 * sizeof(int)); free(b); //第三种方式 int (*c)[4] = new int[3][4]; free(a); delete[] c; return 0; }
注意: delete与free可以混搭
-
内存泄漏: (Memory Leak) 指的是程序中已经动态分配的堆内存因为某种原因,未释放或者无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果!
例子:(正常情况,用完就释放)#include <stdio.h> #include <stdlib.h> #include <string.h> #include <Windows.h> using namespace std; //正常的用完就释放 void test() { int* a = new int[1024]; //每次申请4k a[0] = 0; delete[] a; } int main() { for (int i = 0; i < 1000000; i++) { test(); Sleep(50); //休眠0.05s } return 0; }
打开任务管理器,发现占用内存不会增加。
异常版本: (用了不释放)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <Windows.h> using namespace std; //用完不释放 void test() { int* a = new int[1024]; //每次申请4k a[0] = 0; } int main() { for (int i = 0; i < 1000000; i++) { test(); Sleep(50); //休眠0.05s } return 0; }
结果:打开任务管理器,观察。
过一会儿:
可以直观的看到内存的不断增加。
可以预见,时间变长,循环次数变多会导致怎样的结果!
本节我们介绍了动态内存,下节我们介绍变量的存储类型。