我正在使用MS Visual Studio 2010在Windows 7上编写一个32位C ++应用程序。在这个应用程序中,我遇到的问题是,在没有意义的点上我得到了堆栈溢出异常。该线程的堆栈实际上不应该包含太多,我通常不使用递归。如果我在MSVS项目设置中增加堆栈保留大小,则此错误消失,但是我很快就开始从OpenCV获取内存不足错误( - > 堆),即使我的根据Windows的任务经理的说法,程序远低于2 GB的内存消耗。
但首先,一些背景:应用程序是巨大的(数万行代码),甚至发布部分代码都没有多大意义,反正我也不允许:D。该应用程序使用并发,也就是说,我自己创建了大约10个线程,这些线程做了大量工作,但我正在使用的库创建更多。我的应用程序的I / O很疯狂,我正在接收(并处理)1000 Hz的传感器值,进行全景图像拼接(GPU),光学图像流分析,h264视频流编码等,所有这些都是实时的。我正在使用几个C ++库(用于视频读取/图像处理的OpenCV,用于GUI的Qt 4.8,用于创建我自己的处理线程和共享内存的提升,......)。
一些背景信息(您可能想跳过它,下面的要点问题是我真正需要帮助的那些):
在将cv::Mat
矩阵移交给另一个类的另一个函数时,我在MSVS调试器中得到堆栈溢出异常。例如。类A
,方法A1
(由runA1()
方法执行,该方法在我在A
的初始化中自己创建的boost-thread内运行)获得{{1}例如来自OpenCV的视频阅读器,cv::Mat x
将A::A1()
传递给x
。 B::B1(cv::Mat x)
是另一个类,B
是其中的一个方法。但是,在输入B1()
后,我得到堆栈溢出。现在我想提一下在我的程序中的没有点,我正在使用递归函数调用,所以这不是原因。另外,我不使用B1()
中的局部变量大量填充堆栈。我的问题基本上是:我不知道为什么堆栈会那么完整,我也不知道如何找出运行A::A1()
的线程堆栈实际上是什么(除了查看MSVS的 Locals -debug窗口,但那个没有告诉我线程堆栈的大小(以字节为单位)。 A1()
矩阵不应该是问题的根源,因为它们就像智能指针一样。运行cv::Mat
的线程的调用堆栈中有13个元素/方法调用,所以这也不是问题(再次,我不使用递归)。很长一段时间以来,我能够通过在编译器选项中设置A1()
并将堆栈保留大小从 1MB (默认)增加到 10MB来绕过这个问题。我必须做两件事(是的,我知道这是假的,但如果我没有,例如,如果我只是将堆栈保留大小设置为10而没有Zm选项,我仍然会得到堆栈溢出)。但是,由于我编写了一些更多的新功能,我突然不得不将其增加到 50MB 以使其正常工作。知道我使用的各种库确实创建了更多超出我控制的线程,每个线程获得50 MB的堆栈储备,我意识到我生活在一个危险的世界,记忆方面。因此,在我的代码执行期间,OpenCV的分配例程很快就会抱怨没有足够的可用内存(此时,进程资源管理器显示内存使用量为600 MB)。我不确定该怎么做。
所以这里有一些我一直在问自己的问题: