c++ - 在 IDE 中调试 C++ 队列

标签 c++ visual-studio visual-studio-2015 clion

我要调试这段代码:

#include <iostream>
#include <queue>
#include <random>
#include <time.h>

using namespace std;

int main()
{
    cout << "Hello, World!" << endl;
    queue<int> q;
    srand(time(NULL));
    for(int i = 0; i < 10; i++)
    {
        q.push(rand() % 100);
    }
    int a = q.front();
    q.pop();
    int b = q.front();
    q.pop();
    cout << "a: " << a << ", b: " << b << endl;

    return 0;
}

我尝试在 2 个 IDE 上调试它 - CLion(我个人最喜欢的)和 VS2015。但是,这两个都没有显示队列项(例如,如果我使用数组,它们就会显示):

克利昂

enter image description here

VS2015

enter image description here

随着我继续调查,我注意到如果我删除 CLion 中的上断点,它确实会显示队列元素:

CLion - 好版本

enter image description here

关于为什么会发生这种情况的任何想法,以及是否有办法在“坏”情况下查看队列元素?

最佳答案

移除上断点并在 32 位和 64 位编译之间切换不会对此产生影响。 32/64 位与生成的汇编代码有关。一旦代码编译正确,32 位和 64 位汇编代码将不同,但程序本身仍将保留相同的功能。也就是说,64 位程序不能比 32 位大程序“做得更多”。这是图灵完备性的超淡化定义,但这里的结果是,无论您将构建目标设置为 32 位还是 64 位,对于您现在尝试做的事情来说都无关紧要。

不过,您使用的 IDE 在这里的影响很小,因为它们使用不同的调试器。由于两个调试器在你的情况下做了同样的事情,我想说我们可以安全地将其归结为用户错误(见下文),但就像我在后记中所说的那样,如果你愿意,请继续使用调试器。这是掌握绝对必要的技能。提早开始的建议。

至于你的调试问题,here is my debug of your program.注意我使用的断点。就像耶稣基督在我面前说的那样,调试对我们双方都有效。在这些情况下,通常怀疑是在尝试调试发布版本。当您编译调试版本时,编译器不会执行那么多的优化来让您通过变量跟踪您的代码并准确查看发生了什么。一旦您的代码运行正常,您就可以切换到发布版本,您的编译器将优化大量变量以获得最佳性能。

如果您像您所说的那样在 Debug 版本下进行调试,那么我会说将其归结为调试器错误。如果您是 C++ 新手,您可能经验不足,无法驾驭错综复杂的调试器。没有不尊重的意思,但调试既是一门科学,也是一门艺术,新开发人员不会因为不知道如何准确操作该工具而受到指责。

关于c++ - 在 IDE 中调试 C++ 队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43201388/

相关文章:

c - Visual Studio 社区 2015 和 KMD

c# - 是否有可用于从 xsd 生成 c# 类的 T4 模板?

c - Awesomium sdk下载

c++ - cpp迭代器问题

C++ vector 初始化?

c++ - Qt - pdftocairo pdf 转换过程在应用程序自动启动时不起作用

C++ 宏和命名空间

.net - 使用nuget包部署单个文件

c++ - 为什么我在编译 DLL 项目时收到错误 LNK1561 "Entry point must be defined"?

visual-studio-2015 - VS2015 扩展 - 获取错误列表中的选定项