我有一个指针向量,我真的需要在程序中继续执行其他任务之前确保使用的内存是空闲的。我不想依靠操作系统来管理对delete
的调用,所以我想自己做,因为后来我想将这些代码移到内存有限的嵌入式平台上。我写了下面的代码来测试一个简单的场景:我选择了int指针,例如...实际的数据可能是别的!例如一个POD或类删除矢量中的元素需要永久完成
#include <vector>
#include <iostream>
#include <Windows.h>
#define NUM_ELEMENTS 1000000
double PCFreq = 0.0;
__int64 CounterStart = 0;
void StartCounter()
{
LARGE_INTEGER li;
if (!QueryPerformanceFrequency(&li))
std::cout << "QueryPerformanceFrequency failed!\r\n";
PCFreq = double(li.QuadPart)/1000.0;
QueryPerformanceCounter(&li);
CounterStart = li.QuadPart;
}
double GetCounter()
{
LARGE_INTEGER li;
QueryPerformanceCounter(&li);
return double(li.QuadPart - CounterStart)/PCFreq;
}
int main()
{
/***** CREATE VECTOR **********/
std::cout << "Generating " << NUM_ELEMENTS
<< " elements." << std::endl;
StartCounter();
std::vector<int *>* vec = new std::vector<int*>;
for (size_t i = 0; i < NUM_ELEMENTS; i++)
{
vec->push_back(new int(i));
}
std::cout << vec->size() << " Have been generated in "
<< GetCounter() << "ms" << std::endl;
std::cout << "Destroying the vector..." << std::endl;
/***** DELETE VECTOR **********/
StartCounter();
while (!vec->empty())
{
delete vec->back(), vec->pop_back();
}
vec->clear();
delete vec;
std::cout << "It took " << GetCounter() << "ms to empty the vector!\r\n"
<< "Press ENTER to exit." << std::endl;
//wait for key to exit
std::cin.get();
return 0;
}
这里是输出到控制台:
Generating 1000000 elements.
1000000 Have been generated in 1077.96ms
Destroying the vector...
It took 16834.9ms to empty the vector!
Press ENTER to exit.
正如你可以看到它大约需要1秒来填充载体,但它需要几乎17S摆脱它。
代码工作,对于1000000个元素,我获得大约35MB的内存,然后在等待密钥部分之前开始缩回到大约1MB。但为什么这么慢?我怎样才能改善这种行为?
嗯....没有人关心仔细阅读我的问题....反正它是视觉工作室玩笨......我跑了程序独立,它用了不到100ms来填充和删除矢量!希望此体验对其他人也有用
为什么用'pop_back()'从向量中删除元素的奇怪方式?你并不需要那样做。 – juanchopanza
如果我不这样做,将不会有可见的内存收缩 –
不,'for(auto p:vec)delete p; vec.clear();' – juanchopanza