vector的內存會不會泄露?
即使不泄露,怎么能縮小所占空間呢?
我們知道vector有個clear()方法?
原型:
~~~
#include <vector>
void clear();
~~~
函數clear()刪除儲存在vector中的所有元素. 如果vector的元素是一些object, 則它將為當前儲存的每個元素調用它們各自的析構函數(destructor). 然而, 如果vector儲存的是指向對象的指針, 此函數并不會調用到對應的析構函數. 在第二種情況下, 為了完全刪除vector中的元素則應使用一個類似于下的循環:
~~~
std::vector<SomeObject*> aVector;
//The elements of the vector are created with the operand 'new' at some point in the program
[...]
for(int i=0 ; i<aVector.size() ; i++)
delete aVector[i];
aVector.clear();
~~~
調用clear之后, vector的尺寸(size)將變成zero. 但它的容量(capacity)卻并不發生變化, vector本身并不釋放任何內存.
如果你想同時做到清空vector的元素和釋放vector的容量, 你可以使用swap技巧。
這樣做會創建一個臨時的空vector, 它將替換希望清空的vector。
**“vector 的 clear 不影響 capacity , 你應該 swap 一個空的 vector。”**
~~~
vector<type>(v).swap(v);
~~~
//對于string則可能像下面這樣
string(s).swap(s);
即先創建一個臨時拷貝與原先的vector一致,值得注意的是,此時的拷貝 其容量是盡可能小的符合所需數據的。緊接著將該拷貝與原先的vector v進行 交換。好了此時,執行交換后,臨時變量會被銷毀,內存得到釋放。此時的v即為原先 的臨時拷貝,而交換后的臨時拷貝則為容量非常大的vector(不過已經被銷毀)
為了證明這一點,我寫了一個程序,如下:
~~~
#include <iostream>
#include <vector>
using namespace std;
vector <string> v;
char ch;
int main()
{
for (int i = 0; i<1000000; i++)
v.push_back("hello vector");
cin >> ch;
// 此時檢查內存情況 占用54M
v.clear();
cin >> ch;
// 此時再次檢查, 仍然占用54M
cout << "Vector 的 容量為" << v.capacity() << endl;
// 此時容量為 1048576
vector<string>(v).swap(v);
cout << "Vector 的 容量為" << v.capacity() << endl;
// 此時容量為0
cin >> ch;
// 檢查內存,釋放了 10M+ 即為數據內存
return 0;
}
~~~
- 前言
- deprecated關鍵字
- 指針(內存泄露)
- 頭文件相互包含(Compiler error C2653: not a class or namespace name)
- 獲取一張圖片的width和height
- This function or variable may be unsafe.
- 智能指針陷阱
- string中的c_str()陷阱
- wstring與string的轉換
- windows下chrome瀏覽器插件不能安裝
- 重定義關鍵字
- 正確釋放vector的內存
- 獲取設備環境HDC
- 抽象類不能實例化對象(但是你明明定義的不是抽象類)
- 重載賦值運算符的自我賦值
- 程序中的變量未初始化
- 成對使用new和delete時要采取相同的形式
- 意想不到的除數為零
- map的初始化(插入數據)
- 正則表達式截取字符串
- 捕獲窗口之外的鼠標消息(鉤子還是??)
- 類中的靜態成員變量(static or const static)
- 有if就要有else(一定成對)
- map查找結果處理
- 使用using namespace std的壞習慣
- new一個指針數組、以及創建動態二維數組
- 使用太多的全局變量
- 沒有及時break出for循環
- vector使用erase后迭代器變成野指針
- C++函數的默認參數(重新定義默認參數)
- 0xC0000005: 讀取位置 xxx時發生訪問沖突
- std::string初始化、最快速判斷字符串為空
- 你開發的軟件安裝在C盤Program Files (x86)下產生的異常