问题描述
node* newNode=new node();
这里的node是一个典型的链表节点类,newNode是用来动态创建一个包含int data
和node* next
属性的新节点的指针。请准确说明 new
关键字返回哪个地址并存储在此处的 newNode
中?
例如在 int* p = arr[n];
中,arr
或 arr[0]
的地址是专门存储的。
解决方法
当您指定 new
关键字时,会发生很多幕后情况。 “new 关键字返回哪个地址”的上下文不是主要关注的问题,您需要知道程序(更具体地说是进程)如何通过操作系统处理内存。
什么是过程?
进程不仅仅是一个程序代码,有时也称为文本部分;它还包括由 program counter
的值和处理器寄存器的内容表示的当前活动。
一个过程一般包括:
-
进程栈,包含函数参数、返回地址和局部变量等临时数据。
-
数据部分,其中包含全局变量。
-
进程还包括一个堆区域(这对您的问题很重要),这是在进程运行时动态分配的内存。
如何动态分配内存?
new 操作符使用该内存创建对象,然后返回一个包含已分配内存地址的指针。
new int; // dynamically allocate an integer.
大多数情况下,我们会将返回值分配给我们自己的指针变量,以便稍后访问分配的内存。
int *ptr{ new int };
然后我们可以通过指针执行间接访问内存:
*ptr = 7;
还有几点要说:
-
当您通过
new
关键字请求一些内存时,操作系统首先从heap
区域(如上所述)搜索满足您的要求所需的空闲内存,如果操作系统找到内存,它被分配给你的变量。 -
当您处理完您的进程后,该进程本身会将内存返回给操作系统,以便其他程序的进程可以使用它。
参考:SILBERSCHATZ、GALVIN 和 GAGNE 的操作系统概念。