2016-10-08 38 views
0

我有一个指针向量,我真的需要在程序中继续执行其他任务之前确保使用的内存是空闲的。我不想依靠操作系统来管理对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来填充和删除矢量!希望此体验对其他人也有用

+0

为什么用'pop_back()'从向量中删除元素的奇怪方式?你并不需要那样做。 – juanchopanza

+0

如果我不这样做,将不会有可见的内存收缩 –

+0

不,'for(auto p:vec)delete p; vec.clear();' – juanchopanza

回答

2

改进很简单:使用vector<int>而不是vector<int*>,因为每个指针只存储一个元素。

如果您的数据较大并且您确实需要存储指针,请使用unique_ptrboost::ptr_vector。这不是1980年,你可以使用RAII。

至于慢速清理,可能是因为您的运行时在其小分配结构中有很多条目,并且必须全部找到正确的条目。

如果你需要有一个指针的向量,但需要更快的释放,建议保持指针的载体,因为它是和保持实际数据deque样容器(listarray<data_t,32>,也许?你得做索引保持你自己,但它会加快删除,如果这是瓶颈)。

+0

谢谢。 int *就是例子,实际的数据可能是一些复杂类型的指针 –

+2

@SaeidYazdani这不是个别动态分配对象的好理由。 – juanchopanza

+2

@SaeidYazdani更具体的原因将是多态接口基指针的向量,即使如此,它们应该是智能指针。 – WhozCraig