如果有这么一句程序: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”,为什么呢?