Visual c++ VisualStudio2005c++;运行时新异常 我有一个VS 2005 C++项目,其中既有调试版本也有发布版本。我尝试了以下4件事: 通过VisualStudio构建调试可执行文件,并通过VisualStudio运行它 在cd'ing到vstudio/debug之后,通过命令行(Cygwin)从外部运行内置的可执行文件(1) 通过VisualStudio构建发布可执行文件,并通过VisualStudio运行它 在cd'ing到vstudio/release之后,通过命令行(Cygwin)从外部运行内置的可执行文件(3)

Visual c++ VisualStudio2005c++;运行时新异常 我有一个VS 2005 C++项目,其中既有调试版本也有发布版本。我尝试了以下4件事: 通过VisualStudio构建调试可执行文件,并通过VisualStudio运行它 在cd'ing到vstudio/debug之后,通过命令行(Cygwin)从外部运行内置的可执行文件(1) 通过VisualStudio构建发布可执行文件,并通过VisualStudio运行它 在cd'ing到vstudio/release之后,通过命令行(Cygwin)从外部运行内置的可执行文件(3),visual-c++,debugging,release,new-operator,Visual C++,Debugging,Release,New Operator,前三个都成功了:程序运行到完成 然而,第四个在运行时崩溃。调试表明,罪魁祸首是在操作符new()中调用malloc()。相关上下文如下所示: template<typename T> class Foo { ... static void bar() { ... T* ptr = new T(); ... } ... } 模板类Foo{ ... 静态空心条(){ ... T*ptr=新的T(); ...

前三个都成功了:程序运行到完成

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

template<typename T> class Foo {
    ...
    static void bar() {
        ...
        T* ptr = new T();
        ...
    }
    ...
}
模板类Foo{
...
静态空心条(){
...
T*ptr=新的T();
...
}
...
}

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

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

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


我不了解您的环境,但您可能应该使用像BoundsChecker这样的工具来查找错误。

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


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

很有可能。当程序在调试器下运行时,操作系统使用不同的堆。请与AppVerifier联系。堆损坏假设似乎是可能的。在我研究其他一些工具之前,你是否有一个假设,为什么它适用于(3)而不适用于(4)?对于(3)-当你说“从VS运行”时,你是指启动或调试吗?在这种情况下,我并不感到太惊讶。我遇到了在调试时不会出现的类似错误(调试器会影响已调试的应用程序)。其中一个是由编译器本身引起的,并由“全部重建”修复。在您的情况下,它可能不会有帮助,但我会尝试一下。事实上,这是一个堆损坏问题。谢谢你的帮助!我尝试在Windows命令shell下运行。我得到了同样的错误,虽然奇怪的是,它不是在完全相同的地点,当我与cygwin启动。这是同一个模板化调用
Foo::bar()
,尽管使用了不同的
T
。在这种情况下,我想我支持Chris。