首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

善用 std::vector 替代手動記憶體管理:安全、簡潔、高效的動態陣列實踐

     編輯:關於VC++

在 C/C++ 中手動管理動態陣列(new[]/delete[]、realloc)既繁瑣又易出錯:需自行追蹤容量、擴容時複製資料、釋放舊記憶體。C++ 標準庫 std::vector 內建分配器,自動處理記憶體增長、複製與釋放,提供強烈的例外安全保證。本文以 ISBN 讀取為例,對比手動實作與 vector 方案,並示範容量預留優化技巧。

手動擴容的痛點


int size = 2;
int* p = new int[size];
int isbn, n = 0;
while (cin >> isbn, isbn != 0) {
    if (n == size) {           // 容量不足
        reallocate(p, size);   // 自寫擴容函數:new 更大、copy、delete 舊、重設指標
    }
    p[n++] = isbn;
}
delete[] p;                    // 必須記得釋放

reallocate 需處理型別通用性(模板化)、例外安全(new 失敗不洩漏)、複製語意等細節,極易寫錯。

std::vector 方案:零管理負擔


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

int main() {
    vector<int> vi;            // 預設初始容量(實作定義,通常 0~256)
    int isbn;
    while (cin >> isbn, isbn != 0) {
        vi.push_back(isbn);    // 自動擴容、複製、銷毀舊空間
    }
    for (size_t i = 0; i < vi.size(); ++i)
        cout << "ISBN: " << vi[i] << endl;
}
  • push_back 平均攤還常數時間,擴容策略通常為 2 倍增長。
  • 隨機存取用 operator[] 或 at()(含邊界檢查)。
  • 析構時自動釋放記憶體,無記憶體洩漏風險。

效能優化:預留容量

若預估資料筆數(如至少 2000 筆),可在建構或執行期預留:


vector<int> vi(2000);      // 建構時指定大小(元素值初始化為 0)
// 或
vector<int> vi;
vi.reserve(2000);           // 僅預留容量,不改變 size()

reserve 避免中間多次重新分配與複製,顯著提升大量資料插入效能。注意 resize 會改變 size() 並預設構造元素,reserve 僅影響 capacity()。

進階提示

  • C++11 起提供 shrink_to_fit() 釋放多餘容量。
  • emplace_back 就地構造,避免暫時物件複製/移動。
  • 自訂分配器(std::allocator)可控制記憶體來源(共享記憶體、記憶體池等)。

結論:除非極度受限環境(嵌入式無標準庫),優先使用 std::vector,將精力集中在業務邏輯而非記憶體簿記上。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved