我在大学,我们通常使用putty通过g++编译代码。当我尝试使用Visual Studio在本地编译代码时,会出现堆栈溢出错误。然而,当使用腻子编译g++时,我不这样做。
我的假设是Windows有一个1MB的堆栈,Linux有一个8MB的堆栈。当我使用putty使用g++进行编译时,我将代码传递给Linux机器,从而获得额外的堆栈空间。
有人能帮我清理一下吗?
使用putty时,您有一个到linux服务器的SSH连接,然后在该linux系统上编译代码。
在linux中的提示下,如果您的shell是BASH
,那么我相信ulimit -a
将显示对包括stacksize
在内的所有内容的内存限制。如果外壳是csh
或tcsh
,则在提示下键入limit
以显示限制值。您可以通过执行echo $SHELL
来查看shell的类型。
我使用SUSE,我知道这些设置可以在/etc/security/limits.conf
中找到。在这里,您可以调整放置在stacksize
上的默认8MB。自从SUSE/SLES 10.1以来,我经历了堆叠大小的默认限制为8MB。我不知道他们为什么把它设置为8MB,以及它对安全有什么影响。多年来,我一直在修改limits.conf
以将stacksize
设置为unlimited
,从未遇到过问题。我不知道这个文件名和位置是否适用于所有其他发行版,或者8MB是否是其他发行版的默认堆叠大小限制。
就像其他人在评论中所说的那样,在main()
和其他函数中声明大型数组变量会导致问题,因为这些变量在执行程序时会放在堆栈中。如果linux操作系统在stacksize
上设置了8MB的硬/软限制,那么运行程序时堆栈上需要超过8MB的内存=失败。
这些年来,我在linux中运行代码时多次遇到这个确切的问题,你编译没有问题,然后去运行它,它似乎只是退出或崩溃而没有解释——当这种情况发生时,总是检查操作系统对堆叠大小的硬/软限制;如果程序运行到完成,那么将stacksize快速更改为unlimited将验证这是否是原因。
解决这个问题的一个快速方法是在.c
或.cpp
文件中全局声明main()之外的那些大变量;这是否是好的编程是另一回事。
linux中有更多的自由,gcc编译器将允许您编译代码以创建可执行文件,而无需检查或抱怨声明的变量超过了stacksize上的硬/软限制。如果声明的变量超过stacksize的值,我不确定gcc、g++或gfortran是否有编译器选项可以在编译时检查。您总是可以计算您声明的变量将使用的内存量:如果一个整数是4字节,如果您执行int myarray[700]
,则为2800字节,int myarray[700][700]
为1960000字节,即1.869MB。
我不知道Microsoft Windows中堆叠大小的默认限制是多少(你提到它可能是1MB),但对于Visual Studio(我不太熟悉),如果它在编译时检查你声明的变量是否超过了操作系统对堆叠大小的限制,我也不会感到惊讶。