"不在任何东西面前失去自我,哪怕是教条,哪怕是别人的目光,哪怕是爱情。" ——《成为简·奥斯汀》
今天在公司听了一堂C++课程,收获颇丰。学到新东西的快乐真的可以盖过其他所有。
本来今天可以写一篇长长的日更,但是由于回家后大部分的时间花在了用PS做组内的一幅图,导致没有足够的时间在12点到来之前写很多。
只能写一点比较明确、印象也比较深刻的内容了。
1. 堆与栈
老师今天提到 STL 容器中,不同的容器运行时数据存储的位置是不一样的。诸如array等是运行在栈中的,而vector、string是运行在堆中的。因此,初始化array时如果指定很大的size是有可能导致栈溢出的,而vector、string则不会。
这里就引出了一个概念,当我们在谈论程序运行时的堆和栈时是在谈论什么?
详细内容在一篇知乎回答中写的很详细了,我只摘取其中基础的部分:
堆,英文是 heap,在内存管理的语境下,指的是动态分配内存的区域。这个堆跟数据结构里的堆不是一回事。这里的内存,被分配之后需要手工释放,否则,就会造成内存泄漏。
栈,英文是 stack,在内存管理的语境下,指的是函数调用过程中产生的本地变量和调用数据的区域。这个栈和数据结构里的栈高度相似,都满足“后进先出”(last-in-first-out 或 LIFO)。
另外摘取另一位博主的总结:
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式类似于链表。
2. 空指针的释放
今天老师特别强调了新开辟内存及其释放的问题。
谈到释放时提到,C++标准中规定了,释放空指针是不会进行任何操作的,因此是没有安全问题的。而这一点甚至有专家都犯过错误。
学习使我快乐,日更亦然;
over~
网友评论