相关疑难解决方法(0)

什么是复制省略和返回值优化?

什么是复制省略?什么是(命名)返回值优化?他们意味着什么?

它们会在什么情况下发生?有什么限制?

c++ optimization c++-faq return-value-optimization copy-elision

350
推荐指数
4
解决办法
7万
查看次数

程序只会崩溃作为发布版本 - 如何调试?

我这里有一个"Schroedinger's Cat"类型的问题 - 我的程序(实际上是我的程序的测试套件,但是程序仍然是)崩溃,但只有在发布模式下构建时才会发生,并且只有在从命令行启动时.通过穴居人调试(即整个地方讨厌的printf()消息),我已经确定了代码崩溃的测试方法,但遗憾的是实际的崩溃似乎发生在某些析构函数中,因为我看到的最后一条跟踪消息都在其他执行干净的析构函数.

当我尝试在Visual Studio中运行此程序时,它不会崩溃.从WinDbg.exe启动时也是如此.仅从命令行启动时才会发生崩溃.这是在Windows Vista,btw下发生的,不幸的是我现在无法访问XP机器进行测试.

这将是非常好的,如果我能得到的Windows打印出堆栈跟踪,或一些其他不是简单地结束,如果它已经退出干净方案.有没有人对如何在这里获得更有意义的信息有任何建议,希望能解决这个问题?

编辑:问题确实是由一个越界数组引起的,我在这篇文章中对此进行了更多描述.感谢大家帮忙找到这个问题!

c++ debugging

88
推荐指数
7
解决办法
7万
查看次数

如果调试运行良好,但发布崩溃该怎么办

我有一个在调试版本中运行良好的应用程序,但是当我在发布版本中启动它时,我得到了一个

unhandled Exception at 0x0043b134 in myapp.exe: 0xC0000005:
Access violation while reading at position 0x004bd96c
Run Code Online (Sandbox Code Playgroud)

如果我点击"break",它会告诉我没有加载符号,并且无法显示源代码.

在这种情况下我能做些什么来追查问题?

c++ crash debugging release

5
推荐指数
2
解决办法
2万
查看次数

为什么我要使用.NET编译器的调试模式?

我很好奇.NET编译器的调试和发布模式之间存在什么差异,并且遇到了关于.NET中调试与发布的这些问题,以及发布版本与调试行为不同的原因.到目前为止,我真的没有太多关注这些编译器模式.现在我会.

我的问题是,假设我使用的是测试框架(NUnit)和TDD,如果我只是总是在发布模式下编译,我会遇到任何问题吗?

c# compiler-construction debugging nunit release

3
推荐指数
1
解决办法
403
查看次数

Visual C++ - 为什么要使用调试模式呢?

所以我刚刚遵循了为发布模式启用调试符号的建议,并在启用调试符号后,禁用优化并发现如果符号符合发布模式,断点确实有效,我发现自己在想...

  1. 调试模式的目的不是帮助您找到错误吗?
  2. 如果让bug漏过你,为什么还要使用Debug模式呢?

有什么建议?

c++ debugging release-mode visual-studio

3
推荐指数
2
解决办法
1023
查看次数

Windows XP是否自动将数组初始化为零?

我们最近在我们的软件中发现了一个严重的错误,这个错误是由于假设一个动态分配的数组被初始化为零(虽然它没有).所以问题是这样的:

int* foo = new int[1];
foo[0] += 10;
Run Code Online (Sandbox Code Playgroud)

我现在正在尝试估计这种影响,因为我们最近在环境中也有一些变化:我们开始使用运行不同操作系统的新处理单元(之前的Win XP,现在仍在使用,现在除了一些运行Win 8的新单位.

在Win XP机器上运行的计算似乎没有问题,但在Win 8上,相同的二进制文件产生了乱码.所以编译器没有初始化这些数组(这些是优化的版本),但似乎Windows XP确实将新分配的内存初始化为零(而Windows 8没有).这是在某处记录的吗?我能相信这一点,以便我可以假设这个问题不影响以前在Win XP机器上执行的所有计算吗?

c++ windows arrays

3
推荐指数
1
解决办法
104
查看次数

用自己初始化一个字符串(C++)

下面的代码在Linux(g ++ 4.8.4)和Windows(VS Express 2013)上编译,但在执行时会产生不同的结果.

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
    string str = str;
    cout << "'str.length()': "
         << str.length() << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在Linux上我得到:

'str.length()': 140187593065792
Run Code Online (Sandbox Code Playgroud)

在Windows上,我得到:

'str.length()': 0
Run Code Online (Sandbox Code Playgroud)

另外,如果我更改了如下所示的初始化语句,那么它符合但它在运行时崩溃(在Linux上我得到:在抛出'std :: bad_alloc'的实例后调用terminate):

string str = str + str;
Run Code Online (Sandbox Code Playgroud)

我理解,在这两种情况下,这不是初始化字符串变量的常用方法.但是,有人可以解释这段代码的真正错误吗?另外,为什么第一种情况下输出不同?

c++ string

0
推荐指数
1
解决办法
99
查看次数