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

C++ vector::clear() 不釋放內存:為何新建 vector 仍需 clear?避免 TLE 的關鍵

     編輯:程式設計綜合問答

現象

HDU 1520 題目中,vector<int> son[6007] 全局數組,主循環每次測試案例前調用 a[i].son.clear()。註釋掉這行導致 TLE(超時)。

根因分析

vector::clear() 僅調用元素析構函數並置 size=0,**不釋放底層內存 (capacity 不變)**。

  • 全局/靜態 vector 數組,**生命周期贯穿整個程序**,不會自動析構釋放內存。
  • 多組測試數據時,若不 clear(),上一輪殘留數據導致 son.size() 巨大,DFS 遍歷時循環次數爆炸 → TLE。
  • clear() 後 capacity() 保持,下輪 push_back 復用內存,**無重複分配開銷**,效率極高。

內存釋放時機

  • 真正釋放內存:vector 析構時(離開作用域、delete、程序結束)。
  • 手動釋放技巧:vector<int>().swap(v); (C++11 前) 或 v.shrink_to_fit(); (C++11 非強制)。

最佳實踐

  1. **全局/靜態 vector 重用場景:每輪務必 clear()**,僅重置邏輯大小,保留容量複用。
  2. **局部 vector**:離開作用域自動析構釋放,無需手動 clear。
  3. **極大數據一次性用完**:用 shrink_to_fit() 或 swap 釋放內存給系統。

代碼對比

// 錯誤:不 clear,上輪數據殘留
for (int i = 1; i <= n; i++) {
    // a[i].son.clear(); // 註釋掉
    a[i].is = a[i].v;
    // ...
}
// 導致 son.size() 累積,DFS 遍歷無效節點,TLE

// 正確:clear 重置 size=0,capacity 保留
for (int i = 1; i <= n; i++) {
    a[i].son.clear(); // 關鍵!
    a[i].is = a[i].v;
    // ...
}

總結

clear() ≠ 釋放內存。**全局 vector 循環重用時,clear() 是為了重置邏輯尺寸、避免殘留數據污染算法邏輯**,同時保留容量避免重複分配。註釋掉導致 TLE 是因為遍歷了大量垃圾數據,而非內存不足。

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