加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么新的/ malloc在Win x64上失败,尽管有足够的可用内存

发布时间:2020-12-16 09:25:02 所属栏目:百科 来源:网络整理
导读:我有一个强递归函数,它使用new(在std lib中递归到malloc / calloc)为每个函数实例在本地创建一个(非常小的)std :: multimap.在几百次递归之后,虽然我在 Windows XP x64上使用本机64位应用程序,但新功能失败.该机器有10 GB RAM,该应用程序仅使用大约1GB.没有
我有一个强递归函数,它使用new(在std lib中递归到malloc / calloc)为每个函数实例在本地创建一个(非常小的)std :: multimap.在几百次递归之后,虽然我在 Windows XP x64上使用本机64位应用程序,但新功能失败.该机器有10 GB RAM,该应用程序仅使用大约1GB.没有其他大型应用程序正在运行

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

我使用的是Visual Studio 2005和dinkumware STL.故障发生在发布版本中.

编辑:
好的,这是一些代码.
我现在重新安排了代码并将地图放在堆栈上,但它使用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;
        }
}

有趣的是,第一次失败会遇到捕获处理程序,稍后我会以ACCESS VIOLATION和损坏的堆栈结束.

解决方法

您的号码表示容易默认的1MB堆栈大小(c150K x 8).因此,通过快速查看您的代码(以及map :: insert特别是不提供’…’代码),您将遇到与stackoverflow.com的交互:)

您可能正在使用它运行它的操作系统.在Windows上使用VS链接器设置或使用editbin.exe或一些奇特的不可移植的api,将堆栈大小增加三倍,并查看它是否在异常时显着改变观察到的递归计数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读