- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我们正在使用 Qt 4.8,但老实说我认为这与它无关(但我指出以防万一)
我们创建的这个类编译得很好,但在运行时崩溃并出现以下错误:
*错误:53:01Windows 在 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);
我真的很惊讶这个编译。如果这是一个测试并且有人会问我结果会是什么,我会说这不会编译,因为变量重新定义、歧义或类似的东西。但这完全可以编译并在运行时因前面提到的堆损坏错误而崩溃。
谁能解释为什么它会编译,并且当它崩溃时,它会作为堆损坏错误而不是堆栈 [whatever] 错误崩溃?为什么是堆而不是栈?我已经解决了这个问题(它构建正常,运行正常)但我无法解释为什么它的行为不是我所期望的(编译错误,如果那是错误的,我会期望它是一个堆栈错误,不是堆)
我们预计代码会很糟糕,因为我们现在正在使用 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/
我是一名优秀的程序员,十分优秀!