函数结束后局部指针会失效吗?以List类addFirst函数为例
关于List类addFirst函数中newest指针的疑问解答
直接给你结论:第二次调用addFirst(你问题里写的add_first应该是笔误)时,会生成一个全新的newest指针变量,第一次调用的newest在函数结束后已经彻底消亡了。
咱们来掰扯清楚背后的逻辑:
newest是addFirst函数里的局部变量,它的生命周期只存在于函数的单次调用过程中。每次调用addFirst,程序都会为这个函数创建一个独立的「栈帧」——简单说就是一块专门给这次函数调用用的临时内存空间,newest就存在这个空间里。当函数执行完返回时,这个栈帧会被销毁,里面的所有局部变量(包括newest)都会被回收,和下一次调用的变量完全没关系。
结合你的代码走一遍两次调用的流程:
第一次调用
list->addFirst(4):- 程序为这次调用创建栈帧,栈帧里诞生了一个
Node*类型的局部变量newest。 - 执行
new Node(e, first),在堆内存上分配了一个存储值4的新节点,把这个节点的内存地址赋值给newest。 - 更新
first让它指向这个新节点,n++后函数返回。此时栈帧被销毁,newest变量彻底消失,但它指向的堆节点还活着(因为first还在引用它)。
- 程序为这次调用创建栈帧,栈帧里诞生了一个
第二次调用
list->addFirst(8):- 程序再次为这次调用创建一个全新的栈帧,里面重新生成了一个完全独立的
Node* newest变量(和第一次的newest不是同一个,它们在栈上的内存地址都不一样)。 - 再次执行
new Node(e, first),在堆上分配一个存储值8的新节点,把地址赋值给这个新的newest。 - 更新
first指向这个8的节点(此时8节点的next会指向之前的4节点),n++后函数返回,这个新的newest也跟着栈帧被销毁。
- 程序再次为这次调用创建一个全新的栈帧,里面重新生成了一个完全独立的
这里要特别区分两个概念:
- 栈上的
newest指针变量:每次调用都是新的临时变量,函数结束就消失。 - 堆上的
Node对象:每次new都会分配新的堆内存,这些对象会一直存在,直到在析构函数里被delete销毁。
内容的提问来源于stack exchange,提问作者Bata
相关产品推荐
相关产品推荐

