我們使用Qt 4.8的工作,但老實說,我認爲這有什麼用它做(但我指出來,以防萬一)C++ 4.8運行時堆腐敗
我們創造了這個類,編譯得很好,但崩潰在運行時,出現以下錯誤:
* ERROR: 53:01 Windows已經引發了C_plus_plus_QT_project.exe一個斷點。 這可能是由於堆損壞引起的,這表明C_plus_plus_QT_project.exe或其中已加載的任何DLL錯誤。 這也可能是由於用戶按下F12而C_plus_plus_QT_project.exe有焦點。 輸出窗口可能有更多的診斷信息。*
問題是,QFrame m_FrameHeader;是在.h文件和類構造函數上聲明的我們去做的:
QFrame m_FrameHeader(this);
我真的很驚訝這個編譯。如果這將是一個測試,任何人都會問我結果會是什麼,我會說這是不會編譯的,因爲重新定義不明確,含糊不清或者沿着這些線。但是,這完全會在運行時發生前面提到的Heap Corruption錯誤時編譯和崩潰。
任何人都可以解釋爲什麼它會編譯,並且當它崩潰時,崩潰而不是堆棧[錯誤]堆崩潰錯誤?爲什麼堆,而不是堆棧?我已經解決了這個問題(它構建成功,運行正常),但我無法解釋爲什麼它會像這樣行爲,而不是我所期望的(編譯錯誤,如果這是錯誤的,我會期望它是一個堆棧錯誤,而不是堆)
我們預計代碼不好,因爲我們現在正在玩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()
{
}
謝謝,這是一個非常簡單明瞭的解釋。我會喜歡它,但我沒有聲望。 –
不客氣。 – kenrogers
這是一個誤導性的解釋。發生崩潰不是因爲'm_FrameHeader'被任何東西引用。發生這種情況是因爲'm_FrameHeader'有孩子,並且'刪除'孩子,而且他們沒有單獨分配到堆上。 –