如果我在向量上使用.reserve(items),向量将分配足够的内存来猜测我需要的项目数.
如果我以后使用.clear(),那么只清除向量还是保存我之前定义的保留?
谢谢.
在C++ 11 shrink_to_fit是引入补充某些STL容器(例如,std::vector,std::deque,std::string).
Synopsizing,其主要功能是请求与之关联的容器,以减少其容量以适应其大小.但是,此请求是非绑定的,并且容器实现可以自由地进行优化,并使向量的容量大于其大小.
此外,在之前的SO问题中,OP不鼓励使用它shrink_to_fit来减小其容量std::vector.不这样做的理由如下:
shrink_to_fit什么都不做,或者它给你缓存局部性问题,并且执行O(n)(因为你必须将每个项目复制到他们新的较小的家庭).通常,将松弛留在内存中会更便宜.@Massa
有人可以如此善意地解决以下问题:
std::vector).shrink_to_fit?我std::vector在课堂上有静态.当我使用微软的内存泄漏检测工具时:
_CrtMemState state;
_CrtMemCheckpoint( & state);
_CrtMemDumpAllObjectsSince( & state );
Run Code Online (Sandbox Code Playgroud)
我将内容插入向量后会报告泄漏.这对我来说很有意义,因为当向量中插入某些内容时会分配新的空间.在程序终止之前,该空间不会被释放(因为向量是静态的).这是正确的吗?
在包含向量的类的析构函数中,我正在删除放入向量的对象.但是,插入时分配的内存仍然存在.反正有没有删除这个空间?
我有一个1000"节点"的矢量
if(count + 1 > m_listItems.capacity())
m_listItems.reserve(count + 100);
Run Code Online (Sandbox Code Playgroud)
问题是,当我要重新填充它时,我也清楚了.
m_listItems.clear();
Run Code Online (Sandbox Code Playgroud)
容量不会改变.我用过调整大小(1); 但这似乎并没有改变容量.那么如何改变储备呢?
在一个程序中,我分配一个巨大的多维数组,进行一些数字运算,然后只有该数组的第一部分是进一步感兴趣的,我想释放数组的一部分并继续处理数组中的数据第一部分。我尝试使用 realloc,但我不确定这是否是正确的方法,因为我必须保留数组中的数据,并且最好避免在内存中复制该块。
#include <cstring>
#include <cassert>
#include <iostream>
using namespace std;
void FillArrayThenTruncate(char* my_array, const int old_size, int* new_size);
int main() {
const int initial_size = 1024*1024*1024;
char* my_array = static_cast<char*>(malloc(initial_size));
assert(my_array);
int new_size;
FillArrayThenTruncate(my_array, initial_size, &new_size);
for(int i = 0; i < new_size; ++i) cout << static_cast<int>(my_array[i]) << endl;
}
void FillArrayThenTruncate(char* my_array, const int old_size, int* new_size) {
//do something with my_array:
memset(my_array, 0, old_size);
for(int i = 0; i < 10; ++i) my_array[i] = i % 3; …Run Code Online (Sandbox Code Playgroud) 当我用"擦除"删除向量中的元素时,则没有清除内存.例如,我创建了一个大小为2000的向量.创建后,程序使用1.5 MB内存.当我进行擦除呼叫时,不会清除任何内容.所有的元素都消失了.但他们仍然记忆犹新.
例如:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//Makes a vector of 2000 items
vector<int> test(200000);
//Pause for test purpose
system("pause");
//erase all elements
test.erase(test.begin(),test.end());
//Pause for test purpose
system("pause");
return false;
}
Run Code Online (Sandbox Code Playgroud)
大小返回0.但该过程仍然使用1,5MB的内存.