My-6ren">
gpt4 book ai didi

c++ - std::map 在低内存情况下导致 "stack overflow"

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:34 32 4
gpt4 key购买 nike

此应用程序正在使用 C++ 在 Windows XP 上的 VS2010 中开发。

当计算机在物理内存上运行时非常低(并且页面文件被禁用,因为它是我们的测试用例),这行代码:

std::map<UINT, std::vector<void *>> MyMap;

在 malloc.c 中导致“堆栈溢出”错误

'return HeapAlloc(_crtheap, 0, size ? size : 1);'

MyApp.exe 中 0x7c90e8e5 处的未处理异常:0xC00000FD:堆栈溢出。

此调用是从应用程序的线程之一进行的。如果内存不足是错误,它应该抛出 bad_alloc

谁能告诉我这里可能是什么原因。

编辑:

这是实际堆栈的样子

ntdll.dll!7c90e8e5()    

[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]

ntdll.dll!7c9100d3()

MyApp.exe!_heap_alloc_base(unsigned int size=72) Line 55 C

MyApp.exe!_heap_alloc_dbg_impl(unsigned int nSize=36, int nBlockUse=1, const char * szFileName=0x00000000, int nLine=0, int * errno_tmp=0x0af3f0e4) Line 431 + 0x9 bytes C++

MyApp.exe!_nh_malloc_dbg_impl(unsigned int nSize=36, int nhFlag=0, int nBlockUse=1, const char * szFileName=0x00000000, int nLine=0, int * errno_tmp=0x0af3f0e4) Line 239 + 0x19 bytes C++

MyApp.exe!_nh_malloc_dbg(unsigned int nSize=36, int nhFlag=0, int nBlockUse=1, const char * szFileName=0x00000000, int nLine=0) Line 302 + 0x1d bytes C++

MyApp.exe!malloc(unsigned int nSize=36) Line 56 + 0x15 bytes C++

MyApp.exe!operator new(unsigned int size=36) Line 59 + 0x9 bytes C++

MyApp.exe!std::_Allocate<std::_Tree_nod<std::_Tmap_traits<unsigned int,std::vector<void *,std::allocator<void *> >,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,std::vector<void *,std::allocator<void *> > > >,0> >::_Node>(unsigned int _Count=1, std::_Tree_nod<std::_Tmap_traits<unsigned int,std::vector<void *,std::allocator<void *> >,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,std::vector<void *,std::allocator<void *> > > >,0> >::_Node * __formal=0x00000000) Line 36 + 0x15 bytes C++

MyApp.exe!std::allocator<std::_Tree_nod<std::_Tmap_traits<unsigned int,std::vector<void *,std::allocator<void *> >,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,std::vector<void *,std::allocator<void *> > > >,0> >::_Node>::allocate(unsigned int _Count=1) Line 187 + 0xb bytes C++

MyApp.exe!std::_Tree_val<std::_Tmap_traits<unsigned int,std::vector<void *,std::allocator<void *> >,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,std::vector<void *,std::allocator<void *> > > >,0> >::_Tree_val<std::_Tmap_traits<unsigned int,std::vector<void *,std::allocator<void *> >,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,std::vector<void *,std::allocator<void *> > > >,0> >(const std::less<unsigned int> & _Parg=less, std::allocator<std::pair<unsigned int const ,std::vector<void *,std::allocator<void *> > > > _Al={...}) Line 544 + 0xd bytes C++

MyApp.exe!std::_Tree<std::_Tmap_traits<unsigned int,std::vector<void *,std::allocator<void *> >,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,std::vector<void *,std::allocator<void *> > > >,0> >::_Tree<std::_Tmap_traits<unsigned int,std::vector<void *,std::allocator<void *> >,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,std::vector<void *,std::allocator<void *> > > >,0> >(const std::less<unsigned int> & _Parg=less, const std::allocator<std::pair<unsigned int const ,std::vector<void *,std::allocator<void *> > > > & _Al={...}) Line 699 C++

最佳答案

  #define STACKSIZE (1024*896)

这肯定是个问题,您的程序的主线程在触发启动堆栈溢出异常的页面保护异常的边缘摇摇欲坠。在 Windows 上,HeapAlloc() 将因两个基本原因而失败。到目前为止,您一直假设的常见故障模式是地址空间不足。

但 Windows 还提供了一个强有力的保证,即任何虚拟内存分配都可以始终映射到 RAM。它没有任何类似于 "out of memory killer" 的东西当内存被过度使用并且没有 RAM 可用于修复页面错误时,随机中止进程。分配总是在保证 RAM 页面可以被丢弃或交换到磁盘的情况下提交。如果您在没有分页文件的情况下运行 Windows,则很难提供这种保证。提交失败是一种明显的可能性。

接下来会发生什么很难猜测,您的堆栈跟踪没有给出任何提示。请务必配置符号服务器,以便获得 ntdll.dll 的符号。但很明显,当提交失败时,HeapAlloc() 将遵循与正常情况不同的路径不同。我猜是某种调试器探测,真的不知道。嵌套越深,需要更多的堆栈空间。这足以触发堆栈保护页面并触发 stackoverflow 异常。

不太确定解决这个问题是否真的很重要,不管怎样你的程序都死了。从提交失败中恢复几乎是不可能的。它是完全随机的,受其他进程中 VM 分配的影响。在没有页面文件的情况下运行需要大量 RAM,并且非常需要仔细控制允许在机器上运行的进程。 RAM 比您在软件中可能做的任何事情都要便宜得多。

关于c++ - std::map 在低内存情况下导致 "stack overflow",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24116370/

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