在C ++中使用new进行二进制搜索的动态内存分配

时间:2014-09-23 15:39:25

标签: c++ memory-management dynamic

我试图找到使用new []分配的最大内存。我使用二进制搜索来快速分配,以便找到可以分配的最终内存

bool allocated = false;
int* ptr= nullptr;
int low = 0,high =  std::numeric_limits<int>;
while(true)
{
    try
    {
      mid = (low + high) / 2;
        ptr = new int[mid];
        delete[] ptr;
        allocated = true;
    }
    catch(Exception e)
    {....}
     if (allocated == true)
    {
        low = mid;
    }else
    {
        high = low;
        cout << "maximum memory allocated at: " << ptr << endl;
    }
}

我修改了我的代码,我正在使用新逻辑来解决这个问题。我现在的问题是它将进入一个永无止境的循环。有没有更好的方法呢?

3 个答案:

答案 0 :(得分:1)

由于以下几个原因,此代码无用。

  1. 根据您的操作系统,在实际访问内存之前,可能会分配或不分配内存。也就是说,new愉快地返回一个新的内存地址,但它还没有使内存可用。实际上,当访问相应的地址时,它会被分配。谷歌“懒惰分配”。如果在使用时而不是在分配时检测到内存不足的情况,则分配本身可能永远不会抛出异常。
  2. 如果您的计算机可用超过2千兆字节且int为32位,alloc最终将溢出并在内存耗尽前变为负数。 然后你可能会得到一个bad_alloc。对所有尺寸的东西使用size_t

答案 1 :(得分:0)

假设您正在进行++ alloc而不是++分配,那么它所使用的地址并不重要。如果你希望它每次都使用不同的地址,那么就不要删除指针。

答案 2 :(得分:0)

这是一个特别糟糕的测试。

对于第一部分,您有未定义的行为。那是因为{@ 1}}只能delete[]指针返回给你。您需要new[],而不是delete[] pvalue

第二件事是,当您不断分配和释放连续的内存块时,您的方法将对内存进行碎片整理。我想你的程序会因为这种碎片效应而低估最大块大小。对此的一个解决方案是从命令行将程序的实例作为新进程启动,将分配块大小设置为参数。在log(n)试验中使用除法和征服二分法来获得最大尺寸(具有一定的可靠性)。