内存溢出,我该怎么办呀!!(一直在线,立即给分!)

sintenk 2002-05-16 03:42:30
我的程序开大约10多分钟后就出现这个错误,请问这是什么原因导致的??
我该如何解决呢??谢谢大家!!!!!!

xxx.exe 中的 0x00528565 处未处理的异常:0xC00000FD: Stack overflow 。
...全文
109 点赞 收藏 17
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zdhe 2002-05-17
三种可能
1。 caller 和calle的调用规范不同。比如说,caller是_stacall, calle是_cdecl,虽然看起开函数个数类型完全相同。stack's cleaner is diffirent.

when call a dll or a lib which is not you made.
this is possible.

for a func, if first time no problem, then this is not reason.


2. you modified
you bug change the ret stack.

in this time, add __try, __catch in every sub func, you will get known where is the detail reason.

3. stack overflow, just uppers write. it's possible.
change like option to modify default stack size.
回复
fhbkyo 2002-05-17
大部分的情况是因为分配的内存未释放造成的
有些程序在运行时会出现如xxxxxxxx不能为READ,叫你关掉这程序
问题大概也是这样的
回复
ydaye 2002-05-17
顺便插一句题外话:
inline的作用是向编译器指明该函数为内联函数,当调用此函数时直接把代码展开到调用处,也就是在生成的机器码对应的汇编中不用call指令,因此,程序使用inline反而会减少栈的使用,更不可能是导致栈溢出的原因了。可参见msdn中的inline索引。

本人设计了简单的证明方法如下:
class a
{
public:
int aaa;
inline void bbb();
};
inline void a::bbb()
{
int tmp;
__asm
{
call l1
l1:
pop eax
mov tmp,eax
}
aaa=tmp;
}
bbb()的功能是得到bbb()函数中l1标号处的地址。
在主程序中添加如下代码:
a a1,a2;
a1.bbb();
a2.bbb();
CString str;
str.Format("%X %X",a1.aaa,a2.aaa);
然后随便将str显示在何处,即可对inline概念一目了然,但是需要注意的是:msdn指出,在debug环境下编译器不使用inline功能,因此在release环境下才能看出效果,效果是a1.aaa不等于a2.aaa。

若将主程序中代码改为:
a a1,a2;
a1.bbb();
int tmp;
__asm
{
call l1
l1:
pop eax
mov tmp,eax
}
a2.bbb();
CString str;
str.Format("%X %X %X",a1.aaa,tmp,a2.aaa);
将会有新的发现,然后请去掉inline或用debug方式编译,将又有不同。

一点拙见,欢迎指正。
回复
晨星 2002-05-16
你有没有把大量的函数设置成inline?
回复
Richuen22 2002-05-16
贴出相关代码。
回复
canco 2002-05-16
栈溢出,导致访问了受保护的内容。
推荐看《WINDOWS程序调试》,本书将为你解惑。
http://www.csdn.net/expert/topic/694/694634.xml?temp=.7656061
回复
wyalchemy 2002-05-16
可能就是用了不当的递归。
或许你可以提供更多的 信息,便于大家帮你解决问题
回复
jslj 2002-05-16
栈溢出,函数递归调用了太多层。
回复
west_wood 2002-05-16
你的栈溢出了。
你看看你的程序中是否有循环或是递归,在循环或是递归中是否有内存占用。
如果有把它移出。如果不能移出将它分配到堆中(用NEW)。
因为系统默让的栈的空间为1M,当然你也可能在创建线程时设置更多的空间。
回复
志_祥 2002-05-16
最近看到书上说,在vc里可以设置堆栈大小(默认是1m)
方法是:
Project-->settings->link->category选output-->看见了吧?
这样就不用怕什么堆栈溢出了!!!
回复
ydaye 2002-05-16
栈被用作存放局部变量、调用函数前存放返回地址等,vc中每个工程默认栈大小为1m,new分配的空间不在栈(stack)中,在堆(heap)中,因此不会是由于new了不delete造成的。
栈溢出可能的原因是:生成了大量局部变量或使用了大的局部数组、递归函数设计不当无出口导致一直调用无法返回。
一点拙见,欢迎指正。
回复
helloair 2002-05-16
对呀,把代码写出来看看
回复
ahao 2002-05-16
不可能只有这一条吧
回复
sintenk 2002-05-16
看不懂呀:(


> xxx.exe!_chkstk() 行91 Asm


call Stack里有这么一条
回复
xiaoli_110 2002-05-16
你的有什么东东没有释放。
回复
thb 2002-05-16
检查所有new的地方,是否被释放。还有可能是内存的非法访问.
回复
ahao 2002-05-16
你用F5调试,出问题后查看Call Stack就知道了
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-05-16 03:42
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……