C++ 在C+中使用带二进制搜索的new动态内存分配+;
我正在尝试使用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[]
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心理状态实际上有助于最大限度地利用可用空间。如果你在任何地方都有可用的内存位,分配多个小内存块可能适合这些洞,而一个大内存块则不适合。