如果有這麼一句程序: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”,為什麼呢?
v1不一定在堆棧上,在不在堆棧上要看它屬於的那個A的實例對象在不在堆棧上。
你把問題想復雜了。new和malloc的在堆上,局部變量在堆棧上。如果一個對象在堆棧上,它的成員也在堆棧上,如果一個對象在堆上,它的成員都在堆上。