关于栈的析构问题

Posted SmartGame

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于栈的析构问题相关的知识,希望对你有一定的参考价值。

  关于栈这个问题我自己理解的比较抽象,其实我之前也写过,在C中我们可以把栈区看成是cpu,下面我将它与操作系统的部分理论结合起来讲解好了,倘若我们把每个模块(即函数)看成是就绪状态,也就是说,我们写出代码就是已经准备运行的状态,但是倘若我们不进行编译的话,也就是说不给它分配内存空间(cpu),这样的话,是不会产生结果的。

  当我们点击编译时,开始往cpu中导入数据也就是开始分配资源,要注意的是导入的数据并不是我们写的代码,而是我们通过代码所操纵内存空间的操作,也就是对于资源的操作,正如同当我们生成.exe文件后可以直接运行,然后这个时候的程序可以称为进程了,然后就有了进程控制块PCB,可以理解为每个进程运行时都分配了内存空间(资源),然后通过PCB来控制这些资源,也就是说一个进程运行完了之后我们不再使用它了,如果不释放它,它就会一直占用资源,造成了资源浪费,这对于一些大型工程来说是很要命的;所以在进程运行完了之后,要进行资源释放,栈的释放(析构)就是这个原理(大概是这样吧!);

  其实这正如同我们平时点击应用图标一样,这个应用图标就是一个接口,然后把应用所需资源导入cpu;

  然后我们的问题就来了,栈的析构到底是什么样的,其实在前面我已经说过了,所以这里我稍微说的详细一点;

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 
 5 void CiteConstants(int a);//形参为普通常量
 6 
 7 void CitePointer(int *a);//形参为指针
 8 
 9 void main()
10 {
11     int a = 0;
12 
13     CiteConstants(a);
14     printf("main:%d\\n",a);
15     CitePointer(&a);
16     printf("main:%d\\n",a);
17 
18     system("pause");
19     return ;
20 }
21 
22 void CiteConstants(int a)//形参为普通常量
23 {
24     a = 10;//改变a的值不会改变main函数中啊
25     printf("CiteConstants:%d\\n",a);
26 }
27 
28 void CitePointer(int *a)//形参为指针
29 {
30     *a = 12;
31 }

  在这里我们可以看见,当我们调用一个函数时会新开辟一个不同于main函数的栈区,也就是他们是不相干的两块空间了,也就是说无法通过普通变量改变main里的值,但是指针却可以,因为指针里储存的是地址,它直接操作main函数里的内存空间;

  通过上面的图我们可以看出来由函数所分配的栈空间,就像基础数据类型一样分配的内存空间,那么也就是说这个栈是有首地址的,说到这里估计都明白了,函数体其实也是一种数据类型,而函数名就是找到这个地址的接口,或者说门牌号。

  那么这么一来,我们就引出了函数指针,因为既然它有地址,自然就可以用一个指针来指向它了,然后通过指针来操作它的内存空间,所以说绕到了最后,还是地址,或者说指针的问题;

  其实这析构一点在C++中的析构函数中可以充分的体现出来,以后要是写C++的话我会再详细写的;

  至于函数体括号里的参数,它们其实和写在函数体里面是一样的,只不过是有对外的属性(即可以通过外界资源改变参数的值),也就是说函数体被析构是,他们会一同被析构掉;

  

以上是关于关于栈的析构问题的主要内容,如果未能解决你的问题,请参考以下文章

C ++中的析构函数调用顺序[重复]

C++中基类的析构函数为什么要用virtual虚析构函数

php析构方法关于栈的问题

内置类型的析构函数(int、char 等)

gcov 报告的析构函数中的分支是啥?

为什么基类的析构函数要写成虚函数?