2014-11-24 77 views
1

見下面我的代碼:爲什麼在功能調用後內存不會釋放?

void foo() { 
    std::ifstream f("data"); 
    string line; 
    vector<string> r; 
    while(getline(f, line)) { 
    r.push_back(line); 
    } 
    f.close(); 
    r.resize(0); 
} 

int main(int argc, char *argv[]) 
{ 
    foo(); 
    cout << "load done" << endl; 
    while(1) {;} 
    return 0; 
} 

我使用一段時間(1)循環到htop工具檢查出的內存使用量,r可使用5GB RES,但印刷load done後,RES仍然需要5GB。有什麼問題?

+3

向量將內存返回給分配器,但分配器可能不會將它返回到操作系統,它不是必需的。 – sp2danny 2014-11-24 10:38:25

+0

請不要將隨機標籤附加到您的問題。 [C]與此無關; 'std :: vector <>'完全不是C類型的。 – MSalters 2014-11-24 10:39:55

回答

2

調整大小並不能保證底層內存將被釋放。

您應該試試shrink_to_fit,這會降低容量來適應其尺寸。

+0

此後不久,矢量被破壞 – sp2danny 2014-11-24 10:39:03

+0

@ sp2danny這是一個很好的觀點。儘管如此,沒有將5gb返回到操作系統是很奇怪的。也許OP的觀察結果不正確。 – 2501 2014-11-24 10:41:16

+0

Resize保證不釋放任何底層內存(間接,至少,因爲不允許任何迭代器無效)。 – 2014-11-24 11:18:47

0

我認爲從矢量克拉斯的擦除和/或清除功能會爲你做。 矢量的一個很好的文檔也在cpusplus.com

+0

這是不正確的。 – 2014-11-24 12:11:04