gpt4 book ai didi

c++ - 为什么 new/malloc 在 Win x64 上失败,尽管有足够的空闲 RAM?

转载 作者:可可西里 更新时间:2023-11-01 14:44:37 27 4
gpt4 key购买 nike

我有一个强递归函数,它使用 new(递归到 malloc)为每个函数实例在本地创建一个(非常小的)std::multimap/calloc 在标准库中)。尽管我在 Windows XP x64 上使用 native 64 位应用程序,但经过数百次递归后,新的失败了。机器有 10 GB RAM,应用程序只使用大约 1GB。没有其他大型应用程序正在运行。

这发生在启动程序并启动递归函数几分钟后。此时递归函数已被调用约 150.000 次,可能是最大值。数百个递归。出现的问题不是堆栈溢出。

我正在使用 Visual Studio 2005 和 dinkumware STL。故障发生在发布版本中。

编辑:好的,这是一些代码。我现在重新排列代码并将 map 放在堆栈上,但它使用 new 进行初始化 - 它失败了。我还尝试使用 std::multimap 而不是 hash_multimap。所有这些都不会改变行为。

    int TraceBackSource(CalcParams *CalcData, CKnoObj *theKno, int qualNo, 
double maschFak, double partAmount, int MaschLevel, char *MaschID,
double *totalStrFlow, int passNo,
CTraceBackData *ResultData)

{ typedef std::hash_multimap<double, CStrObj *>StrFMap;
StrFMap thePipes;

for(...)
{
...
thePipes.insert(std::make_pair(thisFlow, theStr));
}

// max. 5 elements in "thePipes"
for(StrFMap::iterator it = thePipes.begin(); it != thePipes.end(); it++)
{
...
try
{
TraceBackSource(CalcData, otherKno, qualNo, maschFak * nodeFak, nodeAmount, SubMaschlevel, newMaschID, totalStrFlow, passNo, ResultData);
}
catch(std::exception &it)
{
Trace(0, "*** Exception, %s", it.what());
return 0;
}

return 0;
}
}

有趣的是,第一个失败遇到了 catch 处理程序,稍后我以访问冲突和损坏的堆栈结束。

最佳答案

您机器上的 RAM 量和正在运行的其他进程与此特定场景无关。每个进程都分配有相同数量的虚拟地址空间。此空间的大小与您机器上的 RAM 量或运行的其他进程无关。

这里发生的事情可能是以下情况之一

  • 您只是分配了过多的内存。在 64 位中很难做到,但是可能
  • 没有具有请求大小的连续可用内存块。

关于c++ - 为什么 new/malloc 在 Win x64 上失败,尽管有足够的空闲 RAM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1609669/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com