《数据结构,算法与应用 C++语言描述》第一章

关于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这是一个好的编程习惯。

下面是问题代码:

问题代码(第一章13题)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • C++运算符重载-下篇 本章内容:1. 运算符重载的概述2. 重载算术运算符3. 重载按位运算符和二元逻辑运算符4...
    Haley_2013阅读 1,485评论 0 49
  • C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要。在目前的计算机系统或嵌入式系统中,内存资源仍然是...
    一生信仰阅读 1,204评论 0 2
  • (JG-2014-08-20)(前半部分经过网上多篇文章对比整理)(后半部分根据ExceptionalCpp、C+...
    JasonGao阅读 5,631评论 2 23
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,384评论 11 349
  • 初识文名在课堂, 白洋淀里芦花扬。 人品如菊有风骨, 文韵似水无异芳。 明月清风少变幻, 悲欢苦乐多沧桑。 百年树...
    小林神阅读 214评论 0 0