【问题标题】:win7 + vc7.1 + mfc = stackoverflowwin7 + vc7.1 + mfc = stackoverflow
【发布时间】:2010-04-23 12:30:40
【问题描述】:

我已将我的 vc7.1 项目从 WInXP 移至 Win7。重建后,当我启动程序时,函数 _malloc_dbg 出现 stackoverflow 错误。

"Unhandled exception at 0x0051bf0f in XXX.exe: 0xC00000FD: Stack overflow."

----------------------
Call stack:
> msvcr71d.dll!_malloc_dbg(unsigned int nSize=140, int nBlockUse=2, const char * szFileName=0x10267784, int nLine=163)

  msvcr71d.dll!_calloc_dbg(unsigned int nNum=1, unsigned int nSize=140, int nBlockUse=2, const char * szFileName=0x10267784, int nLine=163)

  msvcr71d.dll!_mtinit()

  msvcr71d.dll!_CRTDLL_INIT(void * hDllHandle=0x10200000, unsigned long dwReason=1, void * lpreserved=0x0018fd24)

----------------------

我尝试在项目选项中设置不同的堆栈大小(从 10 到 100 兆字节),但在所有情况下都出现此错误。

我该如何解决这个问题?

【问题讨论】:

  • 编译时有警告吗?
  • 我得到了很多。在 WinXP 中工作时我没有任何警告,现在我有类似警告 1. 警告 C4312: 'type cast' : 从 'int' 转换为更大尺寸的 'void *' 2. 警告 C4267: '=' : conversion from ' size_t' 到 'int',可能会丢失数据
  • 这可能不言而喻,但您可能应该先解决这些问题。您现在构建的是 64 位还是之前构建的是 32 位?
  • >你现在是在构建 64 位还是以前是 32 位?我一直在 32 位 WinXP 中工作,现在我有 64 位 Win7,但我将我的项目构建为 32-位应用程序。
  • 与 Vista/Win7 兼容的最后一个 Visual Studio 版本是 VS2005。已经 7 年了,该升级了。

标签: c++ visual-studio visual-c++ mfc


【解决方案1】:

诸如“从 'int' 转换为更大尺寸的 'void '”和“从 'size_t' 转换为 'int',可能丢失数据”之类的警告几乎肯定意味着您不小心将应用程序编译为64 位。他们想说的是 int 的大小(通常为 32 位)和 size_t 或 void 是不同的。在 32 位编译中 size_t 通常与 int 大小相同,而在 64 位中它可能是 64 位。这同样适用于像 void* 这样的指针类型。

我会首先仔细检查您的应用程序实际上是在 32 位模式下构建的。有没有类似unix“文件”的东西可以运行来检查可执行格式?

检查完后,我可以想到堆栈溢出的两个可能原因:由于您显示的代码在 malloc 中,因此您可能有一个潜在的堆内存错误,该错误现在刚刚出现在新环境中。如果它正在丢弃堆栈的一部分,它可能看起来像是溢出了。

另外,您可能会无意中无限递归(同样,可能是由于构建环境的细微变化)并实际上耗尽了所有堆栈。无限递归可以非常快地耗尽堆栈空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 2012-05-02
    • 1970-01-01
    相关资源
    最近更新 更多