ITPub博客

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

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

作者:cjk 时间:2019-09-24 10:52:53 0 删除 编辑

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

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

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

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

class A {};

A a; //A的对象在栈中分配内存

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

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

#include <string>
#include <vector>
using namespace std;

class A {
public:
    A(void) :v1(10) {v1[0]="abc";}
    vector<string> 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”,为什么呢?

若解决我的迷惑给72分,我总共才72分,没有耐心或细心读问题的就不要回答了,暂时不需要粗心或太抽象的指导性的意见,谢谢!

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4715/viewspace-3143714/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-29

  • 博文量
    181
  • 访问量
    1134