关于栈内存
小弟最近的一个项目接近尾声,但是稳定是不是很好,经常莫名其妙的出现段错误,而且具体无法定位,后来经过反复验证发现和在栈上申请了过大的内存有关,其中的一个线程申请到了4M,请问在Linux系统下,栈分配小于多少更合适?
[解决办法]
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
用ulimit -a可以设置或查看当前的栈大小
对于程序来说 最好别超过2MB
[解决办法]
上面说法也不准确 ( 2MB的默认值)
栈上的内存还是少用
如果你递归调用的话
内存很容易溢出
[解决办法]
见
http://stackoverflow.com/questions/8017499/what-is-the-standard-size-of-the-stack-and-the-heap-in-a-c-program/8017534#8017534
[解决办法]
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可。
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!