为了在C++中调试,如何声明一个不被优化的变量(放入寄存器)?

kan*_*eda 5 c++ compiler-construction optimization gdb

我正在用C++/Qt开发一个简单的应用程序,我有以下声明:

QGridLayout *layout = new QGridLayout;

我正在使用gdb调试应用程序.我设置了一个断点,它运行正常,调试器就行了.但是,如果我尝试检查上面声明的对象,我得到这个输出:

-data-evaluate-expression --thread 1 --frame 0 layout 
^done,value="<value> optimized out>"
Run Code Online (Sandbox Code Playgroud)

我读到这条消息,"<value> optimized out>"是因为编译器对代码进行了优化,并将数据放入寄存器中.我正在使用g ++编译器,设置了flag -O0(无优化).

是否存在我缺少的东西,或者它是否存在一种声明变量不被优化的方式,比如存储说明符register?我在Ubuntu 10.10 Maverick,内核2.6.35-24.

EDIT1

更多代码:

WorkspaceChooserDialog::WorkspaceChooserDialog(QWidget *parent) : QDialog(parent)
{
    setWindowTitle(tr("Select a workspace location"));
    QLabel *wpLabel = new QLabel(tr("Workspace:"), this);
    QLineEdit *wpLineEdit = new QLineEdit(QDir().homePath(), this);
    QPushButton *okButton = new QPushButton(tr("OK"), this);
    QPushButton *cancelButton = new QPushButton(tr("Cancel"), this);
    QGridLayout *layout = new QGridLayout;

    connect(okButton, SIGNAL(clicked()), this, SLOT(accept()));
    connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));

    qDebug() << "begin: " << layout << " :end";
    layout->addWidget(wpLabel, 0, 0);
    layout->addWidget(wpLineEdit, 0, 1, 1, 2);
    layout->addWidget(okButton, 1, 1);
    layout->addWidget(cancelButton, 1, 2);
    setLayout(layout);
}
Run Code Online (Sandbox Code Playgroud)

EDIT2

由于我不知道的原因,在我使用详细模式-v标志设置编译后,错误不再出现,即使再次取消设置后也是如此.现在gdb创建变量,我能够检查它的值.

对于谁感兴趣,编译器的标志集是:

g++ -O0 -g3 -Wall -c -fmessage-length=0
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 2

使用volatile。也许,它会对你有帮助!

为什么我们在 C++ 中使用 volatile 关键字?