C++类的成员变量分配在堆上,还是栈上

DrSmart 2011-10-17 12:22:26
Class A
{

public vector<string> m_list;


}

则,类A中的m_list变量分配在堆中,还是栈上
...全文
1714 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2011-10-17
  • 打赏
  • 举报
回复
还是算了,我的意思是vector中的元素,肯定在堆上。
pathuang68 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 drsmart 的回复:]

谢谢大家,结贴给分,调研下国内C++程序员的基础,看来还是不乐观,楼上的回复都很好,再次感谢。
[/Quote]

坚持自己的观点。我会另外开一贴来讨论这个问题。
DrSmart 2011-10-17
  • 打赏
  • 举报
回复
谢谢大家,结贴给分,调研下国内C++程序员的基础,看来还是不乐观,楼上的回复都很好,再次感谢。
myhaikuotiankong 2011-10-17
  • 打赏
  • 举报
回复
给楼主推荐一篇文章:http://blog.sina.com.cn/s/blog_74f586a50100sv6m.html
chos2006 2011-10-17
  • 打赏
  • 举报
回复
看对象本身是在那里吧
WindYou 2011-10-17
  • 打赏
  • 举报
回复
m_list的分配方式取决于A对象分配方式。vector对象本身和vector所包含的内容不是同一个概念。vector可以是在堆上,也可以在栈上;当然包含了一个指向堆的指针,也就是vector的内容。
class A{
public:
int *ptr;
} a;

如果按照:“vector容器的内部实现用到了动态内存分配,因此vector对象肯定分配在堆上。”这一理论,那么当上述机构中,ptr==NULL时,a是在堆上还是在栈上?所以显然这个理论是站不住脚的。
机智的呆呆 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pathuang68 的回复:]
C/C++ code


class A
{
public:
int a; // 在栈上
int *b;
A()
{
b = new int[10]; // 在堆上
}
}


vector容器的内部实现用到了动态内存分配,因此vector对象肯定分配在堆上。

楼主的代码,好像是Java或者C#的风格……
[/Quote]
vector对象未必分配在堆上.这个取决于
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class vector:public xx
{

}
中 _Alloc的配置和实现。
elegant87 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dizuo 的回复:]
m_list只是A的成员,取决于A的分配方式。
[/Quote]
动态分配的存储在堆上
ryfdizuo 2011-10-17
  • 打赏
  • 举报
回复
m_list只是A的成员,取决于A的分配方式。
pengzhixi 2011-10-17
  • 打赏
  • 举报
回复 1
[Quote=引用楼主 drsmart 的回复:]
Class A
{
public vector<string> m_list;
}

则,类A中的m_list变量分配在堆中,还是栈上
[/Quote]

int main()
{
A obj;//A中的m_list本身在栈上,m_list中的string元素在堆上
A*ptr=new A;//A中的m_list和string元素都在堆上。
}
DrSmart 2011-10-17
  • 打赏
  • 举报
回复
呵呵,没事的,调试器跑下就知道了,vector内部肯定是new实现的。
星羽 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pathuang68 的回复:]

C/C++ code

class A
{
public:
int a; // 在栈上
int *b;
A()
{
b = new int[10]; // 在堆上
}
}


vector容器的内部实现用到了动态内存分配,因此vector对象肯定分配在堆上。

楼主的代码,好像是Java或者C#的风格哈。
[/Quote]



pathuang68 的说法是不对的
比如

int main()
{
vector<int> a;
}

a在栈上,如果vector里有个 int* data,指向实际内容,内容是new出来的
那么变量data也在栈上,但data指针指向的数据在堆上
只有vector<int>* a = new vector<int>;这个时候变量a才在堆上
星羽 2011-10-17
  • 打赏
  • 举报
回复
取决于A在哪里

如果A* a = new A,那么他们的成员变量都在堆上
如果 A a; 那么他的成员变量都在堆上,如果是全局变量,那么在静态全局变量区
pathuang68 2011-10-17
  • 打赏
  • 举报
回复

class A
{
public:
int a; // 在栈上
int *b;
A()
{
b = new int[10]; // 在堆上
}
}

vector容器的内部实现用到了动态内存分配,因此vector对象肯定分配在堆上。

楼主的代码,好像是Java或者C#的风格哈。
pathuang68 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 drsmart 的回复:]
Class A
{

public vector<string> m_list;


}

则,类A中的m_list变量分配在堆中,还是栈上
[/Quote]

毫无疑问在堆中。
衣袋 2011-10-17
  • 打赏
  • 举报
回复
那要看用A这个类定义的是对象是全局对象,还是局部对象,还是动态分配的吧。。。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧