我试图找到使用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;
}
}
我修改了我的代码,我正在使用新逻辑来解决这个问题。我现在的问题是它将进入一个永无止境的循环。有没有更好的方法呢?
答案 0 :(得分:1)
由于以下几个原因,此代码无用。
new
愉快地返回一个新的内存地址,但它还没有使内存可用。实际上,当访问相应的地址时,它会被分配。谷歌“懒惰分配”。如果在使用时而不是在分配时检测到内存不足的情况,则分配本身可能永远不会抛出异常。int
为32位,alloc
最终将溢出并在内存耗尽前变为负数。 然后你可能会得到一个bad_alloc。对所有尺寸的东西使用size_t
。答案 1 :(得分:0)
假设您正在进行++ alloc而不是++分配,那么它所使用的地址并不重要。如果你希望它每次都使用不同的地址,那么就不要删除指针。
答案 2 :(得分:0)
这是一个特别糟糕的测试。
对于第一部分,您有未定义的行为。那是因为{@ 1}}只能delete[]
指针返回给你。您需要new[]
,而不是delete[] pvalue
。
第二件事是,当您不断分配和释放连续的内存块时,您的方法将对内存进行碎片整理。我想你的程序会因为这种碎片效应而低估最大块大小。对此的一个解决方案是从命令行将程序的实例作为新进程启动,将分配块大小设置为参数。在log(n)试验中使用除法和征服二分法来获得最大尺寸(具有一定的可靠性)。