C++ 4.8 运行时堆损坏

标签 c++ qt heap-memory heap-corruption

我们正在使用 Qt 4.8,但老实说,我相信这与它无关(但我指出以防万一)

我们创建的此类可以正常编译,但在运行时崩溃并出现以下错误:

*错误: 53:01 Windows 在 C_plus_plus_QT_project.exe 中触发了断点。 这可能是由于堆损坏造成的,这表明 C_plus_plus_QT_project.exe 或其加载的任何 DLL 中存在错误。 这也可能是由于用户在 C_plus_plus_QT_project.exe 具有焦点时按了 F12。 输出窗口可能有更多诊断信息。*

问题是QFrame m_FrameHeader;在 .h 文件和我们执行的类构造函数上声明:

QFrame m_FrameHeader(this);

说实话,我对这个编译结果感到惊讶。如果这是一个测试,并且有人问我结果是什么,我会说这不会编译,因为变量重新定义、歧义或类似的情况。但这完全可以编译并在运行时崩溃,并出现前面提到的堆损坏错误。

任何人都可以解释为什么它会编译,并且当它崩溃时,它会作为堆损坏错误而不是堆栈[无论如何]错误崩溃?为什么是堆而不是栈?我已经解决了这个问题(它构建正常,运行正常),但我无法解释为什么它的行为像这样,而不是我所期望的(编译错误,如果这是错误的,我会期望它是一个堆栈错误,而不是堆错误)

我们预计代码会很糟糕,因为我们现在正在使用 Qt,所以我们没有关注它的质量。请忽略它(除非您认为这是当前问题的一部分,在这种情况下,请根据需要指出它,哈哈)。

我们的环境:Qt 4.8.2、VS2010、Windows 7 x64。

这是.h

#include <QtGui\QWidget>
#include <QtGui\QLabel>
#include <QtGui\QHBoxLayout>
#include <QtGui\QVBoxLayout>
#include <QtGui\QGridLayout>
#include <QtGui\QFrame>

class Quiniela : public QWidget
{
private:
    QLabel m_Fecha;
    QLabel m_Titulo;
    QLabel m_Hora;
    QHBoxLayout m_HeaderLayout;
    QFrame m_FrameHeader;
    QHBoxLayout m_SorteosLayout;
    QHBoxLayout m_EntesLayout;
    QGridLayout m_MainLayout;
public:
    Quiniela(int w = 800, int h = 600,QWidget* parent = 0);
    ~Quiniela();
};

这是 .cpp

#include "Quiniela.h"
#include "FramePrincipal.h"
#include "Utils.h"

Quiniela::Quiniela(int w, int h, QWidget * parent)
    : QWidget(parent)
{
    Utils objUtil;
    QFont fontHead("Arial", 24, QFont::Black);
    QFont fontSorteos("Arial", 20, QFont::Normal);
    resize(w,h);
    setWindowTitle("QUINIELA");
    QFrame m_FrameHeader(this);
    m_FrameHeader.setGeometry(0,0,800,50);
    m_Fecha.setText(objUtil.getDate());
    m_Fecha.setFont(fontHead);
    m_Titulo.setText("*** QUINIELA ***");
    m_Titulo.setFont(fontHead);
    m_Hora.setText(objUtil.getTime());
    m_Hora.setFont(fontHead);
    m_HeaderLayout.addWidget(&m_Fecha,0,Qt::AlignLeft);
    m_HeaderLayout.addWidget(&m_Titulo,0,Qt::AlignCenter);
    m_HeaderLayout.addWidget(&m_Hora,0,Qt::AlignRight);
    m_HeaderLayout.setAlignment(Qt::AlignTop);
    m_FrameHeader.setLayout(&m_HeaderLayout);
}

Quiniela::~Quiniela()
{
}

最佳答案

您必须对 Qt 对象使用指针(Qt 通过指针维护其对象的父子链接,并在删除父对象时销毁子对象)。在您的示例中,m_FrameHeader 在构造函数返回时被销毁,因为它被声明为局部变量。

关于C++ 4.8 运行时堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11040617/

相关文章:

C++将局部变量存储到 vector 中可防止它在超出范围时被破坏

c++ - 抽象基类 C++ 中的静态回调

c++ - 将 wxwidgets opengl 应用程序移植到不依赖库的应用程序

c++ - QFlags 枚举类型转换突然失败

java - 我如何允许用户轻松地选择在 Java Swing 应用程序中分配多少内存?

c++ - 从数据库加载数据以在 qml 中公开

c++ - 显示以每个方 block 为对象的棋盘 - C++ QT

qt - 在 QTableWidget 中分别处理单击和双击

java - 当使用 -xmx 增加堆大小时,使用 netbeans 创建 .jar 文件

带有 GSON 的 Java 堆空间