代码之家  ›  专栏  ›  技术社区  ›  Roland

对早期大学生进行C++内存管理的最佳策略和实例是什么?

c++
  •  7
  • Roland  · 技术社区  · 7 年前

    因此,我将在即将到来的学期里教一个第二学期大学新生的C++课程。学生们使用了数组(尽管只是静态分配的),并且有一些引用和指针的概念(但可能不多)。一般来说,他们没有做很多关于动态内存分配和管理的工作。我正试图利用堆栈溢出社区的全球智能,以您的集体经验来看,向年轻的计算机科学学生传授指针和内存管理等知识的最有效方法是什么?

    有很多关于相关主题的有趣的stackoverflow帖子:

    When teaching C, is it better to teach arrays before or after pointers?

    What are the barriers to understanding pointers and what can be done to overcome them?

    What is the real difference between Pointers and References?

    should we teach pointers in a "fundamentals of programming" course?

    What are the important notions in C that you did not learn from your teachers

    我当然对我的教学方式和内容有自己的看法,但我真的很感兴趣,我的教学方法和你的有什么不同。一些需要考虑的子问题(您当然不限于此):

    • 你会按什么顺序教东西?你会如何把这些话题联系起来?普通“堆栈变量,后跟引用,后跟指针?数组放在哪里?你什么时候介绍“新”关键字?等。

    • 你看过哪些视觉辅助工具最能表达这些概念?例如,为内存位置绘制框,其中包含值,变量/指针作为名称,箭头指向框?你有没有读过一些特别的网站或教科书,上面有很好的描述?

    • 是否有特定的代码示例(例如“swap”函数)比其他代码更容易获得信息?

    教!

    编辑

    为了与我发布的一些链接区分开来:

    之前我发布的大多数so链接都非常直接地关注指针。尽管指针是理解记忆行为不可或缺的一部分,但我对学生理解记忆一般工作方式的更重要主题感兴趣。如何最好地说明normal、pointer和reference声明之间的区别?如何强调全局、堆栈和堆变量之间的差异?我认为甚至把返回地址推送到调用堆栈上也是公平的。你认为记忆管理最重要的方面是什么,你如何把它们联系在一起,你如何以一种连贯的方式来理解它们?

    6 回复  |  直到 14 年前
        1
  •  1
  •   Alexander Torstling    16 年前

    因为我一直都是一个讲逻辑的人,所以我最想听 为什么? 您需要动态分配,而不是它的工作方式和语法在特定语言中的使用方式。从静态分配开始,转到遇到限制时的情况,引入动态分配。尝试解释不同的运行时范围(编译时、运行时和边界情况)。解释何时使用哪种分配技术。对于堆分配,您可以使用共享内存的情况,并说明有必要有一个引用机制,并通过该机制引入指针。显示您无法使用共享所有者语义轻松确定内存区域的生存期,并显示不同的解决方案(引用计数、手动释放等),并描述为什么您需要权衡而不仅仅是一个解决方案。使用除内存分配(例如raii)以外的其他示例来说明您所展示的技术不仅限于内存,还包括任何类型的资源。

    我认为,关键是要从头开始积累知识,不要把人当白痴(blinky),而是要记住,很多人在这一领域的经验有限,需要具体的例子来把握为什么所有的特点都是到位的。有许多因素在起作用,并且清楚地定义约束,使学生理解问题的表述可能是教学这类事情最重要的方面。

    一个例子胜过千言万语,给学生具体的例子,让他们知道到目前为止他们所知道的事情并没有减少,这使他们能够对问题进行推理,并最终采取下一步行动。

        2
  •  5
  •   monksy    16 年前

    我见过 blinky video 以前。这有点奇怪,但它确实说明了这一点。

        3
  •  2
  •   Steve Rowe    16 年前

    我发现教指针概念最好的类比是url。网页是内存,url是指针。每个学生都会熟悉它们,这是一个间接的“具体”例子。

    至于排序,我认为静态分配后面跟着指针,然后才是引用。引用虽然简单,但在许多方面是指针的特例,在引入它们之前,需要教授大多数指针概念。

        4
  •  0
  •   Jim Wallace    16 年前

    制造微处理器。理解内存是线性布局的(在大多数计算机体系结构中没有二维数组,[][]是syntitatic sugar),并且由mux寻址是我直到那时才理解的事情。从那以后,一切都建立在这个基础上,包括地址如何进入寄存器,由alu处理,然后放回内存和/或压入堆栈。

        5
  •  0
  •   Grim Serious    16 年前

    如果有人雇我来教记忆管理,祝福他们天真的心,我会从堆/堆的不同开始。

    计数变量?我会把它叠起来。
    读取未知数量的值?我不知道你的情况,但我会把它们扔到垃圾堆上。

    诸如此类的事情。

    如果你只是教投球,那是另一场比赛。
    我想我的老师用了这个比喻: 指针是地址(duh),值是房子。
    我想每个人至少都能理解那么多。

    我总是想把事情简单化(有时候太多了)。也许这会有帮助。

        6
  •  0
  •   Rob deFriesse    16 年前

    我建议你从讨论物体生命周期开始。如何创建对象,以及程序员如何在删除对象时进行控制。这将使您在了解指针的基本知识之前逐步了解必要的抽象。生命周期涉及并激励上面提到的所有概念:基于堆栈的分配、C++引用和指针。

    如果你认为你的学生已经准备好了,你也可以讨论聪明的指针。如果你能教他们尽可能避免生涩的观点,你会让他们和他们未来的同事们免于悲伤。