【问题标题】:C++: debug OK ,run release get wrong answerC++:调试好,运行发布得到错误答案
【发布时间】:2018-06-27 01:58:36
【问题描述】:

我已经提取了出现问题的代码 下面的代码用向量定义了一个二维数组。然后打印二维数组。当我使用调试模式运行它时,它会打印正确的答案,但是当我在没有调试的情况下运行它时(即发布模式)。有时它会打印整个二维数组,有时它会打印其中的一部分,然后直接退出而没有任何消息。为什么会这样?谢谢!。

运行环境:
Windows 10 版本:10.0.16299.125
克利昂 2017.3
Mingw64 5.0

Clion 的 CmakeLists.txt:
cmake_minimum_required(版本 3.8)
项目(测试)
设置(CMAKE_CXX_STANDARD 11)
设置(SOURCE_FILES main.cpp)
add_executable(测试 ${SOURCE_FILES})


#include <vector>
#include <iostream>

using namespace std;

int main()
{
    vector<vector<int>> graph{{0, 4,  0, 0,  0,  0,  0, 8,  0},
                              {4, 0,  8, 0,  0,  0,  0, 11, 0},
                              {0, 8,  0, 7,  0,  4,  0, 0,  2},
                              {0, 0,  7, 0,  9,  14, 0, 0,  0},
                              {0, 0,  0, 9,  0,  10, 0, 0,  0},
                              {0, 0,  4, 14, 10, 0,  2, 0,  0},
                              {0, 0,  0, 0,  0,  2,  0, 1,  6},
                              {8, 11, 0, 0,  0,  0,  1, 0,  7},
                              {0, 0,  2, 0,  0,  0,  6, 7,  0}};


    for(int i = 0; i < graph.size(); i++)
    {
        for(int j = 0; j < graph[i].size(); j++)
        {
            cout  << i << "-" << j  << ": "<< graph[i][j] << endl;
        }
        cout << endl;
    }
    return 0;
}

输出不稳定,有时成功,有时失败,以下是两个错误的输出 第一个错误输出:

E:\coding\LCCPP\Test\cmake-build-debug\Test.exe
0-0: 0
0-1: 4
0-2: 0
0-3: 0
0-4: 0
0-5: 0
0-6: 0
0-7: 8
0-8: 0

1-0: 4
1-1

1-1:
Process finished with exit code 0

第二个错误输出:

E:\coding\LCCPP\Test\cmake-build-debug\Test.exe
0-0: 0
0-1: 4
0-2: 0
0-3: 0
0-4: 0
0-5: 0
0-6: 0
0-7: 8
0-8: 0

1-0: 4
1-1: 0
1-2: 8
1-3: 0
1-4: 0
1-5: 0
1-6: 0
1-7: 11
1-8: 0

2-0: 0
2-1: 8
2-2: 0
2-3: 7
2-4: 0
2-5: 4
2-6: 0
2-7: 0
2-8: 2

3-0: 0
3-1: 0
3-2: 7
3-3: 0
3-4: 9
3-5: 14
3-6: 0
3-7: 0
3-8: 0

4-0: 0
4-1: 0
4-2: 0
4-3: 9
4-4: 0
4-5: 10
4-6: 0
4-7: 0
4-8: 0

5-0: 0
5-1: 0
5-2: 4
5-3: 14
5-4: 10
5-5: 0
5-6: 2
5-7: 0
5-8: 0

6-0: 0
6-1: 0
6-2: 0
6-3: 0
6-4: 0
6-5: 2
6-6: 0
6-7: 1
6-8: 6

7-0: 8
7-1: 11
7-2: 0
7-3: 0
7-4: 0
7-5: 0
7-6: 1
7-7: 0
7-8: 7

8-0: 0
8-1: 0
8-2: 2
8-3: 0
8-4: 0
8-5: 0
8
Process finished with exit code 0

正确的输出:

E:\coding\LCCPP\Test\cmake-build-debug\Test.exe
0-0: 0
0-1: 4
0-2: 0
0-3: 0
0-4: 0
0-5: 0
0-6: 0
0-7: 8
0-8: 0

1-0: 4
1-1: 0
1-2: 8
1-3: 0
1-4: 0
1-5: 0
1-6: 0
1-7: 11
1-8: 0

2-0: 0
2-1: 8
2-2: 0
2-3: 7
2-4: 0
2-5: 4
2-6: 0
2-7: 0
2-8: 2

3-0: 0
3-1: 0
3-2: 7
3-3: 0
3-4: 9
3-5: 14
3-6: 0
3-7: 0
3-8: 0

4-0: 0
4-1: 0
4-2: 0
4-3: 9
4-4: 0
4-5: 10
4-6: 0
4-7: 0
4-8: 0

5-0: 0
5-1: 0
5-2: 4
5-3: 14
5-4: 10
5-5: 0
5-6: 2
5-7: 0
5-8: 0

6-0: 0
6-1: 0
6-2: 0
6-3: 0
6-4: 0
6-5: 2
6-6: 0
6-7: 1
6-8: 6

7-0: 8
7-1: 11
7-2: 0
7-3: 0
7-4: 0
7-5: 0
7-6: 1
7-7: 0
7-8: 7

8-0: 0
8-1: 0
8-2: 2
8-3: 0
8-4: 0
8-5: 0
8-6: 6
8-7: 7
8-8: 0


Process finished with exit code 0

【问题讨论】:

  • 我认为这段代码没有问题,虽然最好用size_t而不是int。显示所有代码/另一部分代码。
  • @АндрейМоскаленко 最好使用auto :)
  • 我在您的代码中找不到错误。尽管如此,我还是使用 gcc、clang 和 intel 编译器在 RetHat 6 上编译了它。我更改了优化级别。在所有情况下,调试和发布都有相同的输出。

标签: c++ c++11 debugging mingw clion


【解决方案1】:

也许通过添加std::flush来检查这个解决方案:

for(auto v : line )
{
    cout  << i << "-" << j  << ": "<< v << endl << flush;
    j++;
}

它将“强制”所有输出。顺便说一句,我认为这是代码优化的一些问题。

【讨论】:

    【解决方案2】:

    代码没有实际问题,可能是 IDE 不提供输出的问题。本质上,您的程序在控制台中打印整个管道缓冲区之前退出。子进程退出时管道关闭且没有任何错误,并且父进程没有可打印的内容。如果你在最后暂停程序会发生什么?

    虽然在非 void 函数中不提供“return”是不好的,但 mingw 在 main() 中添加了等效的 return 0;...

    PS:考虑使用 range-fors:

    int main()   
    {
        using namespace std;
        vector<vector<int>> graph{{0, 4,  0, 0,  0,  0,  0, 8,  0},
                                  {4, 0,  8, 0,  0,  0,  0, 11, 0},
                                  {0, 8,  0, 7,  0,  4,  0, 0,  2},
                                  {0, 0,  7, 0,  9,  14, 0, 0,  0},
                                  {0, 0,  0, 9,  0,  10, 0, 0,  0},
                                  {0, 0,  4, 14, 10, 0,  2, 0,  0},
                                  {0, 0,  0, 0,  0,  2,  0, 1,  6},
                                  {8, 11, 0, 0,  0,  0,  1, 0,  7},
                                  {0, 0,  2, 0,  0,  0,  6, 7,  0}};
    
    
        for(auto &line: graph)
        {
            int i = 0, j= 0;
            for(auto v : line )
            {
                cout  << i << "-" << j  << ": "<< v << endl;
                j++;
            }
            i++;
            cout << endl;
        }
        return 0;
    }
    

    (http://en.cppreference.com/w/cpp/language/range-for)

    【讨论】:

    • 谢谢,我在 main 函数结束时(返回前)让程序休眠 3 秒,(有时)程序仍然打印部分答案,然后等待 3 秒后,程序完成的。 range for 不适合我的真实程序(我已经简化了有问题的代码),但是你对 IDE 的想法给了我一个很好的提示,也许我应该重新安装 Clion 和 mingw。
    • @Damon Hu 这是各种 IDE 的众所周知的问题,它是由操作系统的体系结构定义的。听起来它不适合缓冲区。输出是否非常大&在大多数操作系统上,缓冲区的默认大小是 32k..
    猜你喜欢
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 2017-05-20
    相关资源
    最近更新 更多