私たちはQt 4.8で作業していますが、正直なところ、これは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()
{
}