关于C++中内存分配回收的问题
这些天开始重新学习数据结构与算法相关的知识,由于在第一章的习题上面遇到了一些编译错误,进而对C++相关的知识做了回顾与总结。
编译错误出现在一个动态初始化二维数组的程序中,报错的内容是:pointer being freed was not allocated,简单翻译过来就是被回收内存的指针并没有被分配空间;可是我的确是用new关键字来分配空间的,最后找到问题的症结是出在main函数中直接使用int a[SIZE] = {0},C语言的方式创建数组然后将数据名“a”作为参数传入函数中(此处SIZE为常量)。
找到是这个地方出错,我就先分析了一下,是不是我传送的数组指针是常量指针,后来发现不是这个原因,原因就出在两种方式分配内存的差别:new 分配和类似于int a[SIZE] = {0}的分配方式。这两种方式有何不同呢?
主要不同在于用new分配的空间是存放在堆中,其在内存区域中的分布是不连续的,类似于数据结构中说的链表,该空间需要手动去回收(delete、delete[]),当然如果没有做,最后会由系统来回收,但这就很难说,在此之前会不会出现内存泄漏之类的错误。而后者是以栈的方式由编译器自动分配空间的,其回收也是由编译器自动去回收(当此类变量生命周期结束或离开作用域)。当然如果让我来详细说明为什么栈中的空间怎么就不能delete呢?对于这个问题,我现在还不能回答,等我在《深度探索C++对象模型》这本书找到答案,一定会和大家分享的。
当然有一点是明确的,当你new分配了空间,在你不用的时候,一定要记得delete这是一个好的编程习惯。
下面是问题代码: