【问题标题】:Visual Studio 2005 C++ runtime new exceptionVisual Studio 2005 C++ 运行时新异常
【发布时间】:2009-04-20 14:19:23
【问题描述】:

我有一个带有调试和发布版本的 VS 2005 C++ 项目。我尝试了以下 4 件事:

  1. 通过 Visual Studio 构建一个 Debug 可执行文件,并通过 Visual Studio 运行它。
  2. cd'ing 到vstudio/debug 之后,通过命令行 (Cygwin) 在外部运行内置的可执行文件 (1)。
  3. 通过 Visual Studio 构建一个 Release 可执行文件,并通过 Visual Studio 运行它。
  4. cd'ing 到vstudio/release 之后,通过命令行 (Cygwin) 在外部运行 (3) 内置的可执行文件。

前3个都成功:程序运行完成。

然而,第四个在运行时崩溃。调试显示罪魁祸首是在运算符new() 中调用malloc()。相关上下文如下所示:

template<typename T> class Foo {
    ...
    static void bar() {
        ...
        T* ptr = new T();
        ...
    }
    ...
}

如果有人能想到任何会导致我描述的四分之三症状的问题,我们将不胜感激。

【问题讨论】:

    标签: visual-c++ debugging release new-operator


    【解决方案1】:

    您可能有一个损坏的堆。这可能是由于指针写入分配的内存之外造成的。

    在调试模式下不会发生这种情况的一个可能原因是您只覆盖了堆上的调试信息(在发布模式下不存在)。

    我不知道你的环境,但你可能应该得到一个像 BoundsChecker 这样的工具来查找错误。

    【讨论】:

    • 很有可能。当程序在调试器下运行时,操作系统使用不同的堆。与 AppVerifier 核实。
    • 堆损坏假设似乎很可能。不过,在我研究其中一些其他工具之前,您是否有假设为什么它适用于 (3) 而不适用于 (4)?
    • for (3) - 当你在 VS 中说“运行”时,你的意思是启动还是调试?
    • 在这种情况下,我并不会太惊讶。我遇到了在调试时不会出现的类似错误(调试器会影响被调试的应用程序)。其中之一是由编译器本身引起的,并由“全部重建”修复。它可能对你的情况没有帮助,但我会试一试。
    • 确实是堆损坏问题。感谢您的帮助!
    【解决方案2】:

    我的第一个猜测是 cygwin 为您的程序构建使用的某些 Windows DLL 提供了替换 DLL。

    测试这一点的一个好方法是尝试在 Windows 命令 shell (cmd.exe) 下运行,看看是否会遇到相同的错误。

    【讨论】:

    • 我尝试在 Windows 命令 shell 下运行。我得到了同样的错误,虽然奇怪的是,它与我使用 cygwin 启动时的位置不同。这是相同的模板化调用Foo&lt;T&gt;::bar(),尽管使用了不同的T
    • 在这种情况下,我想我和克里斯在一起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    相关资源
    最近更新 更多