zhuwt2008 2015-03-05 12:10 采纳率: 33.3%
浏览 2370
已采纳

c++语句vector<string> v1;v1对象一定放在栈中吗?

如果有这么一句程序:vector v1;

v1是分配在栈上吗?不要小看这个问题,书里的基础概念我已经读了几遍,但是这个迷惑仍然不能解决,要不我就不用花时间上网来问了,期望能有高手指教,

按一般的理解,大概是这样:

C++对象存放在堆上还是栈上由你的代码控制,用new申请的对象放到堆上(new是没有重载的),否则放在栈上,比如

class A {};

A a; //A的对象在栈中分配内存
A * a = new A(); //A的对象在堆上分配内存

上面应该是没有疑问的,可是看下面代码:

#include
#include
using namespace std;

class A {
public:
A(void) :v1(10) {v1[0]="abc";}
vector v1;
};

A *getA()
{
A * a = new A; // 没重载 new 操作符的。
return a;
}

int main()
{
A *b = getA();
string s1("ABCDEFHIMDI");
printf(b->v1[0].data());
if(b->v1.size()==10) printf(":ok");

return 0;

}

按上面逻辑,上面代码中v1应该在栈上,而“a 指向的内存空间(new A)”应该在堆上,当我调用完getA函数之后,函数getA的栈空间会被自动回收,那么获取的对象指针(即b)所指的对象的成员v1就指向无意义的内存空间(已被回收的栈空间)了,按这个逻辑,似乎都是确切无疑的推理,那么程序应该会出问题,可是程序能正常运行输出“abc:ok”,为什么呢?

  • 写回答

10条回答 默认 最新

  • threenewbee 2015-03-05 14:37
    关注

    v1不一定在堆栈上,在不在堆栈上要看它属于的那个A的实例对象在不在堆栈上。
    你把问题想复杂了。new和malloc的在堆上,局部变量在堆栈上。如果一个对象在堆栈上,它的成员也在堆栈上,如果一个对象在堆上,它的成员都在堆上。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!