清除向量分配的内存

时间:2017-07-23 11:00:40

标签: c++ memory memory-management

我使用了后面的代码和gnome系统监视器来查看内存如何分配到内存中:

#include <iostream>
#include <string>
#include <vector>

using std::string;

int main(void)
{


string sentence;
std::vector<string>words{};


string seperators{" ,:;!."};


std::cout<<"Please enter the line terminated by an asterisk"<<std::endl;

std::getline(std::cin, sentence, '*');


std::cout<<"The sentence is: "<<sentence<<std::endl;
size_t start{0};
size_t end{};
int count{};
while(start != string::npos)
{

    end = sentence.find_first_of(seperators, start + 1);

    string word = sentence.substr(start, end - start);

    std::cout<<word<<std::endl;

    words.push_back(word);

    start = sentence.find_first_not_of(seperators, end +1);

    if(count++ == 10000000)
    {
        std::cout<<"^^^^^^^^^^^^^^^^^^^^^^^^^^^"<<"here"<<std::endl;
        break;
    }
}


words.clear();
//for(auto word: words)
//{
//    std::cout<<word <<std::endl;
   // }

std::cin>>start;

}

当while循环继续时,内存消耗仪表开始以稳定的速率连续增加,并且在循环中断到达10000000的计数后,程序执行words.clear()函数,该函数应该已清除但是,它没有。记忆说,消耗达到53%,直到程序结束。

如果.clear()不是释放向量所释放的内存的方法,那么,我们如何释放它?它本应该自动完成,但我的实验表明它不是。或者,代码有问题吗?

2 个答案:

答案 0 :(得分:3)

你可以调用clear,这会破坏所有对象,但这不会释放内存。循环使用各个元素也无济于事(你甚至建议对这些对象采取什么行动?)你可以做的是:

vector<tempObject>().swap(tempVector);

这将创建一个没有分配内存的空向量,并将其与tempVector交换,从而有效地释放内存。

C ++ 11也有函数shrink_to_fit,你可以在调用clear()之后调用它,理论上它会缩小容量以适应大小(现在为0)。但是,这是一个非约束性请求,您的实现可以忽略它。

答案 1 :(得分:0)

clear()之后调用shrink_to_fit()(添加C ++ 11)以释放std::vector保留的未使用内存。