程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> new-c++語句vector<string> v1;v1對象一定放在棧中嗎?

new-c++語句vector<string> v1;v1對象一定放在棧中嗎?

編輯:編程綜合問答
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”,為什麼呢?

最佳回答:


v1不一定在堆棧上,在不在堆棧上要看它屬於的那個A的實例對象在不在堆棧上。
你把問題想復雜了。new和malloc的在堆上,局部變量在堆棧上。如果一個對象在堆棧上,它的成員也在堆棧上,如果一個對象在堆上,它的成員都在堆上。

caozhy
zhuwt2008
zhuwt2008
zhuwt2008
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved