我有一個指針向量,我真的需要在程序中繼續執行其他任務之前確保使用的內存是空閒的。我不想依靠操作系統來管理對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