You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数结束后局部指针会失效吗?以List类addFirst函数为例

关于List类addFirst函数中newest指针的疑问解答

直接给你结论:第二次调用addFirst(你问题里写的add_first应该是笔误)时,会生成一个全新的newest指针变量,第一次调用的newest在函数结束后已经彻底消亡了。

咱们来掰扯清楚背后的逻辑:

newest是addFirst函数里的局部变量,它的生命周期只存在于函数的单次调用过程中。每次调用addFirst,程序都会为这个函数创建一个独立的「栈帧」——简单说就是一块专门给这次函数调用用的临时内存空间,newest就存在这个空间里。当函数执行完返回时,这个栈帧会被销毁,里面的所有局部变量(包括newest)都会被回收,和下一次调用的变量完全没关系。

结合你的代码走一遍两次调用的流程:

  1. 第一次调用list->addFirst(4):

    • 程序为这次调用创建栈帧,栈帧里诞生了一个Node*类型的局部变量newest。
    • 执行new Node(e, first),在堆内存上分配了一个存储值4的新节点,把这个节点的内存地址赋值给newest。
    • 更新first让它指向这个新节点,n++后函数返回。此时栈帧被销毁,newest变量彻底消失,但它指向的堆节点还活着(因为first还在引用它)。
  2. 第二次调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:28:18