C ++填充deque错误分配

时间:2013-02-21 09:02:09

标签: c++ deque bad-alloc

我正在尝试制作大量随机数来进行算法分析。然后我遇到了这个我无法解释的问题。请考虑以下代码:

#include <exception>
#include <iostream>
#include <deque>

typedef unsigned long long mytype;

const mytype SIZE = 150000000;

int main()
{
    std::deque<mytype> rand;

    try 
    {
        for (mytype i = 0; i< SIZE; i++)
        {
            rand.push_back(1); //Just push a dummy number into the deque
        }

    }
    catch (std::exception& e)
    {
        {
           std::cout << e.what() << std::endl;
        }
    }

    return 0;
}

这将导致错误的分配异常。 问题是如果我使用vector和reserve()它会工作。纠正我,如果我没有做到这一点,是不是deque那种容量更大的数据结构,因为它没有像vector那样连续分配内存?

我在Win8 x64,visual studio 2012,带有8G RAM的intel i7上运行。感谢您分享您的想法

1 个答案:

答案 0 :(得分:2)

问题是由内存碎片引起的。

如果直接使用vector.reserve,则会在开始时获得大块内存。应用程序启动时内存碎片很少,因此当时分配大量内存的机会很高。

当你在循环中使用deque.push_back时,deque将首先保留一小块内存(例如大小为A字节),当循环运行时,deque达到其内存限制,然后它将分配2 * A字节,然后将数据复制到新内存;然后是4 * A字节,然后是8 * A字节....我很久以前就读过deque的代码了,所以细节可能有问题,这里的想法是这个循环会导致很多内存分配/释放这将导致高内存碎片,如果内存碎片很高,分配大量内存的机会很低。

有关内存碎片的详细信息,请参阅this