C语言在堆上创建内容需要用到malloc 并且包括头文件<stdlib.h>
若是C++ 是new 和 delete
C++11中智能指针解决防止内存泄漏的问题。具体不再此篇讲解。
注意:在堆上创建的空间不会自动释放 ,需要手动free掉,并把指针置空
要是指针丢了还没释放就会造成内存泄漏,影响程序的性能,可用空间减少,直到程序关闭,停机,操作系统收回。所以不用空间了,就要立刻释放掉,然后指针一定要归位为NULL。
为什么要指针归位?
答:可能产生野指针
为了更好的理解。附上图片说明
一开始指针指向我开辟的空间内的8这个变量的地址,但是我free掉的只是这个空间的内容,说明在操作系统中是不可访问的区域了,但是我指针的内容依旧是指向这块地址的,指向了一块非法的空间,说明指针不是空的,这样还是下次可以给他赋值,接着使用,但是这样就会造成不知道指针指向的是什么内容,也就是所谓的野指针。
指针中有个不成文的规矩:判断指针是否可用就看是不是空的。
指针如果是空的,就不可用,非空则可用。
什么是野指针,野指针的成因和规避详情可见网址,
《深入理解c++11》 在介绍智能指针这节对野指针的定义以及什么是内存泄漏:
野指针:一些内存单元已经释放,之前指向他的指针却还在被使用。这些内存有可能被运行时系统重新分配给程序使用,从而导致了无法预测的错误。
内存泄漏:不再需要使用的内存单元如果没有被释放就会导致内存泄漏。如果程序不断重复进行这类操作,将会导致内存占用剧增。
额外说下重复释放是什么意思:
重复释放:程序试图去释放已经被释放过的内存单元,或者释放已经被重新分配过的内存单元,就会导致重复释放错误。通常重复释放内存会导致C/C++运行时系统打印出大量错误及诊断信息。
《C++ primer plus》 中对堆栈和内存泄漏的讲解 在P117
总结:为什么free? 答:避免内存泄漏
为什么归位?答:避免产生野指针
在堆上创建一个整型
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
//在堆上分配一个一维数组
int *pA = (int*)malloc(sizeof(int));
*pA = 8;
printf("%i\n", *pA);
free(pA)