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

C++中类对象的数据成员存储位置是栈还是堆?附代码实例疑问

C++中类成员的存储位置遵循三个核心判断规则:

  1. 普通非指针/非引用成员的存储位置和所属对象完全绑定:对象分配在栈,成员就在栈;对象分配在堆,成员就在堆,成员本身是对象内存布局的一部分。
  2. 指针类型成员分两部分:指针变量本身是对象的一部分,跟随对象所在的内存区域;指针指向的动态分配内存(即new出来的内容),无论所属对象在哪,都存储在堆内存。
  3. 函数内的局部变量(包括构造函数内的局部对象):没有用new创建的都分配在当前函数调用的栈帧上,用new创建的都分配在堆内存,和当前函数所属的对象存储位置无关。

逐个问题解答

  • 问题1:fook2->c是否存储在栈内存?
    否。*fook2是堆上分配的Fook对象,c是它的普通成员,属于对象内存的一部分,因此跟随对象存储在堆内存。
  • 问题2:idk1中的*arr是否存储在堆内存?
    是。arr是IDK的指针成员,初始化时用new int[1]申请了动态内存,这部分内存不受idk1本身存储位置的影响,固定分配在堆内存。
  • 问题3:idk2中的*arr是否存储在堆内存?
    是。和上一个问题逻辑一致,arr指向的是new申请的动态内存,必然在堆。
  • 问题4:idk1的构造函数中的*fook4是否存储在堆内存?
    是。fook4是构造函数内用new Fook()创建的对象,动态申请的对象固定分配在堆内存,和idk1本身的存储位置无关。
  • 问题5:idk2的构造函数中的fook3是否存储在堆内存?
    否。fook3是构造函数内的局部非动态对象,属于构造函数调用栈帧的一部分,存储在栈内存,和idk2本身的存储位置无关。
  • 问题6:idk2的构造函数中的*fook4是否存储在堆内存?
    是。只要是new创建的对象都存储在堆内存,和所属函数、所属对象的位置无关。

总结:main函数中各对象的数据成员存储位置

  • fook1(栈上分配的Fook对象):
    普通成员c跟随对象存储在栈内存
  • *fook2(堆上分配的Fook对象):
    普通成员c跟随对象存储在堆内存
  • idk1(栈上分配的IDK对象):
    • 指针成员arr本身跟随对象存储在栈内存
    • arr指向的*arr(int数组)是动态申请的,存储在堆内存
  • *idk2(堆上分配的IDK对象):
    • 指针成员arr本身跟随对象存储在堆内存
    • arr指向的*arr(int数组)是动态申请的,存储在堆内存

内容的提问来源于stack exchange,提问作者Someone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:24:05