首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ vector<string> 物件記憶體配置:堆疊還是堆積?

     編輯:程式設計綜合問答

核心結論

vector<string> v1; 宣告的 v1 物件本身(包含三個指標:開始、結束、容量末端)配置在宣告所在的記憶體區域:

  • 區域變數 → 堆疊
  • new 配置 → 堆積
  • 全域/靜態 → 資料段

但 vector 內部管理的元素陣列(string 物件)永遠在堆積(由配置器 allocator 管理)。

程式碼驗證

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

A* getA() {
    A* a = new A;          // A 物件在堆積
    return a;              // v1 也在堆積(隨 A)
}

int main() {
    A* b = getA();         // b 指向堆積上的 A
    cout << b->v1[0];      // 輸出 "abc",v1 元素在堆積,存活
    return 0;
}

關鍵觀念

  1. 物件存放位置由「如何建立」決定,而非類別定義。
  2. 成員跟隨擁有者:A 在堆積,其成員 v1 物件也在堆積;A 在堆疊,v1 也在堆疊。
  3. 容器元素另行配置:vector 內部指標指向堆積記憶體,與容器物件本身位置無關。

常見誤區

「不用 new 就都在堆疊,堆疊空間小,所以要多用 new。」

錯誤。堆疊預設 1~8 MB,足以支撐大多數區域物件。大型資料、生命週期超出作用域、需動態大小 才用堆積。盲目 new 反而易造成記憶體洩漏、碎片化。

最佳實務

  • 優先使用區域變數(RAII),自動釋放。
  • 需要共享所有權用 std::shared_ptr,獨佔用 std::unique_ptr。
  • 容器元素型別若為大型物件,考慮存放智慧指標或移動語意。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved