博主在B站跟着黑马学C++,黑马的C++课程对于没学过C的同学跟起来还是有些吃力的,此博客专辑用于解答弹幕的一些常见问题,有一些弹幕问题也是作者之前不太了解的,于是查阅一些了资料。博主也是小白,内容有错误希望大佬指出。
首先明确一点:堆区是用于动态内存管理的区域,栈区则用于管理局部变量、函数参数等有生命周期的数据,栈区的数据在生命周期结束时(通常情况下,一个局部变量的生命周期就是所在的从变量创建到该变量所在的代码块结束的代码段),操作系统会自动进行释放,堆区的数据则需要编程者自己释放,否则会一直存储在堆区直到程序运行结束。
如下代码就是问题比较多的地方。
我们看看这段代码的运行流程:
进入主函数后,先在栈区申请一块空间,这块空间属于int*类型的指针p,由于该指针目前只是声明还未初始化,因此该指针(变量)的值还是随机值。为了区分,我们将这个指针称为p1.
接着执行func函数。func函数同样先在栈区申请一块空间,这块空间属于int*类型的指针p,我们将这个指针成为p2。接着new关键字在堆区申请一块空间,堆区的空间类型为int,值是10。p2指向堆区空间的首地址。然后函数返回p2。
栈区的p1接收返回值p2。然后p2生命周期结束,被销毁。但是,func函数在堆区申请的空间生命周期还没结束,因为堆区的空间只有当程序员释放时生命周期才会结束。也就是说,p1利用func的返回值仍能找到堆区中的数字10。在p1解引用时是可以打印的。