删除向量中的元素需要永远完成

时间:2016-10-08 19:53:17

标签: c++ memory vector memory-leaks

我有一个指针向量,我确实需要确保在继续执行程序中的其他任务之前使用的内存是空闲的。我不想依赖操作系统来管理对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秒,但需要花费大约17秒才能摆脱它。

代码工作,对于1000000个元素,我得到大约35MB的内存,然后它在等待键部分之前开始缩小回大约1 MB。但为什么它这么慢?我怎样才能改善这种行为?

嗯....没有人小心翼翼地仔细阅读我的问题....无论如何,这是视觉工作室玩傻...我独立运行程序,花了不到100毫秒来填写和删除向量!希望这种体验对其他人也有用

1 个答案:

答案 0 :(得分:2)

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

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

至于缓慢清理,可能是因为你的运行时在他们的小分配结构中有很多条目,并且必须遍历它们以找到正确的条目。

如果你需要一个指针向量但需要更快的释放,请尝试保持指针向量不变,并将实际数据保存在deque - 就像容器(list的{​​array<data_t,32> 1}},或许?你必须自己做索引保存,但如果这是瓶颈,它会加速删除