这是基于Windows的XP上使用MSVC2010以C ++开发的基于多线程控制台的应用程序。该应用程序消耗大量内存。但是当内存使用量达到2GB左右(Windows 32位内存限制)时,它突然在随机位置崩溃并出现以下任何一种错误:
- R6016-线程数据空间不足
- 0xC0000005:访问冲突读取位置0x02030000
醇>
与此同时,控制台上还会出现一个字符串“运行时错误”很多次。但不确定它到底在哪里(我的代码不打印它)。
不幸的是,在崩溃的地方没有明确的堆栈跟踪或位置。它只会在任何地方崩溃,特别是当内存使用量大约为2GB时。 我希望CRT在无法分配内存时返回错误或失败。在那种情况下,我确保应用程序运行顺利。但是为什么在这个世界上呢 显示带有这些错误的消息框,导致退出应用程序。
我在这方面挣扎了很多天,现在真的难以忍受。我试过了:
1)通过调试器知道代码中崩溃的位置。但它只会在任何地方崩溃。对于例如主要是在新的内存分配调用类似于:
char* ptr = new (std::nothrow) char[1024];
我们可以看到没有理由在此处崩溃的任何应用程序。
2)缩小代码路径以找到崩溃的确切场景:我也无法成功。
作为一种解决方法,我认为不要将我的应用程序的内存使用量接触到2GB。 但后来我想到了一个问题,“即使在内存使用率很低的情况下它也不会崩溃的保证。这可能只是时间问题?”
此外,没有明确的方法可以事先知道要分配how much exact memory is available。
我对此错误感到非常疲惫,迫切需要帮助/指导。
更新
我缩小了这是QueueUserWorkItem
(将函数排队到线程池中的工作线程的Windows函数)的问题。当在没有内存的情况下进行调用时,它会导致线程内部的内存分配失败并出现“运行时错误”不幸的是,我无法在这里给出重现此崩溃的示例代码,因为我通过第三方库调用该函数它非常难以从中提取代码用于演示。
但是为了解释,我调用了函数(带有标志WT_EXECUTELONGFUNCTION
),当它完成时,它会调用我再次调用它的回调(以便它可以处理下一个工作项)。
作为一种解决方法,我试图检查应用程序的内存使用情况(“Private Bytes”),而不是让它触及2GB。希望它应该有用。
答案 0 :(得分:3)
有几个组成部分:
当您使用CreateThread或任何其他不使用_beginthtread / _beginthreadex的函数创建线程时,也会发生此错误。确切地说,在创建线程时您不会收到此错误,当您尝试访问某些需要每线程数据结构的CRT功能时,您将在以后收到此错误。