C++中类对象的数据成员存储位置是栈还是堆?附代码实例疑问
C++中类成员的存储位置遵循三个核心判断规则:
- 普通非指针/非引用成员的存储位置和所属对象完全绑定:对象分配在栈,成员就在栈;对象分配在堆,成员就在堆,成员本身是对象内存布局的一部分。
- 指针类型成员分两部分:指针变量本身是对象的一部分,跟随对象所在的内存区域;指针指向的动态分配内存(即
new出来的内容),无论所属对象在哪,都存储在堆内存。- 函数内的局部变量(包括构造函数内的局部对象):没有用
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
相关产品推荐
相关产品推荐

