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

C++ 在C+中使用带二进制搜索的new动态内存分配+;,c++,memory-management,dynamic,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[]

我正在尝试使用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;
    }
}
bool-allocated=false;
int*ptr=nullptr;
int低=0,高=标准::数值限制;
while(true)
{
尝试
{
中等=(低+高)/2;
ptr=新整数[mid];
删除[]ptr;
分配=真;
}
捕获(例外e)
{....}
如果(已分配==true)
{
低=中;
}否则
{
高=低;

cout假设您正在执行++alloc而不是++分配,那么它使用的地址应该无关紧要。如果您希望它每次都使用不同的地址,则不要删除指针。

这是一个非常糟糕的测试

对于第一部分,您有未定义的行为。这是因为您应该只
删除[]
通过
new[]
返回给您的指针。您需要
delete[]pvalue
,而不是
value


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

由于以下原因,此代码无效


  • 根据您的操作系统,在实际访问之前,内存可能会被分配,也可能不会被分配。也就是说,
    new
    愉快地返回一个新的内存地址,但它现在还不能使内存可用。它实际上是在以后访问相应地址时分配的。谷歌搜索“延迟分配”。如果在使用时而不是分配时检测到内存不足情况,则分配本身可能永远不会引发异常
  • 如果您有一台可用容量超过2 GB的计算机,并且您的
    int
    为32位,
    alloc
    最终将溢出并在内存耗尽之前变为负数。那么您可能会得到一个错误的alloc。对于所有大小相同的内容,请使用
    size\t

  • 你的意思是
    ++alloc;
    ?`同时
    value=newchar[alloc]
    根据您的操作系统和硬件,在
    alloc
    溢出之前,您可能永远不会得到此方法的异常。根据您的操作系统,在您访问元素之前,内存可能不会实际分配到物理ram中。因此,也在其中放置一个memset。是的,但有人可能会认为碎片是正常负载的一部分。此外,frag心理状态实际上有助于最大限度地利用可用空间。如果你在任何地方都有可用的内存位,分配多个小内存块可能适合这些洞,而一个大内存块则不适合。