首页 > 解决方案 > 在可用 RAM 的范围内声明一个带有指针的数组

问题描述

我想使用指针创建一个数组,但我想将其容量设置为最大可用 RAM。我已经测试过这种方法:

void init() 
{
  long  maxSize = 0x7fffffff;
  long capacity = maxSize / sizeof(int);
  int* _array = new int[capacity];
}

但是此方法失败并在运行时给我这个错误:

0x7651A6E2 处未处理的异常:Microsoft C++ 异常:内存位置 0x012FF780 处的 std::bad_alloc。

那么如何以最大可用大小分配我的数组呢?

标签: c++arrayspointers

解决方案


您应该明白,如果您有 10 GB 的空闲 RAM,并不意味着您可以分配 10 GB 的数组。想象一下,该字母e表示一个空的千兆字节,而该字母b表示一个忙碌的千兆字节。在现实生活中,您的 RAM 看起来像这样 eebeebbeeebeebe我们可以注意到,这里有 10 GB 是空闲的,但我们不能在 10 GB 上分配一个数组(别忘了,数组元素在存储中是一致的)。所以我可以建议的唯一方法是检查尺寸,直到找到最大的免费。

所以你的代码可能看起来像这样(但注意std::realloc,你可以通过使用而不是new+来提高大小delete,我正在使用二进制搜索来提高性能)

size_t min = 0;
size_t max = std::numeric_limits<size_t>::max();

int *ptr = new int[min];

while (max - min > 1)
{
    size_t middle = (max - min) / 2 + min;
    try
    {
        int *temp = new int[middle];
        min = middle;
        delete[] ptr;
        ptr = temp;
    }
    catch (const std::exception &e)
    {
        max = middle;
        continue;
    }
}
std::cout << "max_size is " << min << '\n';

推荐阅读