关于指向堆的指针内涵

对于C/C++程序员来说,指针是天堂,同时指针也是地狱。指针有多少好处,又有多少让人头疼的问题我们这里就不多说了。但为了局部解决指针的问题,我们提出了智能指针这个概念。

 

实际上,我一直不明白,智能指针用于干什么!直到我遇到有关栈和堆问题的时候,才依稀有了点感悟,我现在的感悟几乎肯定是不全面的,但是很重要。

几乎有关指针的问题的出现集中在指针指向堆上空间的时候,为什么呢?

如果指针指向的是栈上的空间,我们知道这里的空间是有系统自动管理的,申明释放都是由系统根据栈的策略来进行的。我们能够干预的部分很少。

而对于指向堆空间的指针,由于申请(new),和释放(free)必须要程序员显示的进行调用,并且该空间的生命周期在new语句和free之间。

注意,这就是当年设计C/C++的伟大之处:事实上所有名字的空间(变量)都只会存在于栈(或者更低的内存空间中),而栈根据它特有的先进后出的策略,实现了C/C++语言中复杂的变量生命周期与作用域问题。但是这还不够,对于一个C/C++程序而言,栈就像是一个工作间,有关程序的推进总调度都在这里,它的空间不是很大(有操作系统规定:1M2M,在逐个读取指令执行指令的过程中,需要读取其它空间的空间数据,如“代码区”,“常量区”,“全局/静态区”等等,还有一个非常重要的区域,也是程序得以弹性作业的区域——“堆”,堆区的空间没有大小限制,几乎以操作系统能够承载的最大虚拟存储空间为上限。这里想是一个任意的、临时仓库区。要申请什么空间,在这里申请就是,然后返回一个“句柄”(指针),给程序的“总调令区”——栈区,然后程序可以通过那个指针(栈区)来控制那个堆区的空间。于是似乎整个内存分布过程变得很完美。

但是,麻烦就发生在堆区的空间有用户自定申请,和组织释放,并且它还没有自己的名称(通常的变量名),而只是被指针(地址)指着,而指针有一个可以改变内容的变量(不想变量名和引用名那样的声明之后就不会改变指向的哪个地方)

这样的境况导致的后果就是,程序员必须很仔细的申请并给出对应的释放语句,但是由于程序的复杂都增大,判断、循环、递归这样的语句会让程序的走向处于不定境地。很有可能出现内存泄露的问题。

看到这段话,我一个想法是,指向堆的指针相当于一个句柄,来到底是表示堆中的那一块内存,而为什么指针会出现那么多问题的关键是,指针可以改变指向,但是如果将一个永远不需要改变指向的指针变成const的话,不是很好嘛~~

原文地址:https://www.cnblogs.com/GODYCA/p/2863433.html