向量保持存储器甚至可以与另一个空向量交换
vector hold memory even swap with an another empty vector
我做了一个小实验,代码如下:
vector<char> *p = new vector<char>[1024];
for (size_t i = 0; i < 1024; i++)
{
(*p++).resize(1024 * 1024);//alloc 1 G memory
}
sleep(5);
cout << "start to clear" << endl;
for (size_t i = 0; i < 1024; i++)
{
vector<char> tmp;
tmp.swap(*p++);
}
delete [] p;
cout << "clear over!" << endl;
sleep (5);
//在这里,内存仍然是1G,为什么?非常感谢。
在大多数实现中,内存不会立即返回到操作系统,而是放入"空闲列表"中,因为从操作系统获取内存通常比遍历这样的空闲列表要贵得多。这很可能就是为什么无论你在哪里检查,你仍然能看到1GB的内存。
此外,在您的代码中,我看不出在保留所有向量后在哪里重置p
,基本上是用不属于您的未初始化内存交换空向量。
在两个循环之间没有将p重置为其初始值。第二个循环没有清除初始p,它在为初始p分配的内存之后扰乱了随机内存。
我建议您使用(*(p + i))
或(p + i)->
或p[i]
而不是(*p++)
。或者更好的是,使用vector<vector<char> >
。而不是用临时向量交换。使用clear()成员函数。
编辑:这里有两个很好的实现
vector<char>* p = new vector<char>[1024];
for( size_t i = 0; i < 1024; i++ ){
p[i].resize(1024 * 1024);
}
sleep(5);
cout << "start to clear" << endl;
for( size_t i = 0; i < 1024; i++ ){
p[i].clear();
}
delete [] p;
cout << "clear over!" << endl;
sleep(5);
vector<vector<char> > p(1024);
for( size_t i = 0; i < 1024; i++ ){
p[i].resize(1024 * 1024);
}
sleep(5);
cout << "start to clear" << endl;
for( size_t i = 0; i < 1024; i++ ){
p[i].clear();
}
cout << "clear over!" << endl;
sleep(5);
相关文章:
- C++从另一个类访问公共静态向量的正确方法是什么
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 将一个向量插入另一个向量的某个位置
- 将指向给定子类的指针从一个向量复制到另一个向量
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 使用 std::transform 将向量向量 (a) 添加到另一个向量向量 (b)
- 如何按另一个向量的方向调整一个向量?
- 将字符向量复制到另一个向量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 如何避免将向量的完整值复制到另一个容器
- 如何将所有指针从一个向量移动到另一个向量?
- 如何从另一个向量中的另一个第一元素减去向量中的第一元素
- 用一个向量替换另一个向量的方法
- 如何根据另一个向量中给出的索引拆分向量?
- 如何在另一个类中调用类型类的向量?
- 按另一个向量对一个向量进行排序
- 具有多线程支持的 RenderClass,将函数调用推送到向量以在另一个线程上调用
- 如何设置一个 std::vector 与另一个,其中两个是不同类的向量?