我使用了后面的代码和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()不是释放向量所释放的内存的方法,那么,我们如何释放它?它本应该自动完成,但我的实验表明它不是。或者,代码有问题吗?
答案 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
保留的未使用内存。