【1】源码
工作中,时常会遇到各种各样的异常场景,有些异常场景很常见,必要备录,以防再犯。
分享本案例为:QT创建窗体时parent父窗体传野指针引起异常。
本案例源码如下:
1.1 默认新建一个QT工程(ps:本地QT版本为5.3)
(1)工程目录结构
(2)工程pro文件
1 QT += core gui 2 3 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 4 5 TARGET = CustomComboBox 6 TEMPLATE = app 7 8 9 SOURCES += main.cpp 10 mainwindow.cpp 11 customcombobox.cpp 12 13 HEADERS += mainwindow.h 14 customcombobox.h 15 16 FORMS += mainwindow.ui
1.2 实现自定义控件
(1)customcombobox.h
1 #ifndef CUSTOMCOMBOBOX_H 2 #define CUSTOMCOMBOBOX_H 3 4 #include <QComboBox> 5 6 class CustomComboBox : public QComboBox 7 { 8 public: 9 CustomComboBox(QWidget* parent = NULL); 10 }; 11 12 #endif // CUSTOMCOMBOBOX_H
(2)customcombobox.cpp
1 #include "customcombobox.h" 2 3 CustomComboBox::CustomComboBox(QWidget *parent) 4 : QComboBox(parent) 5 { 6 }
1.3 利用自定义控件
(1)mainwindow.h
1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include <QFrame> 5 #include <QMainWindow> 6 #include "customcombobox.h" 7 8 namespace Ui 9 { 10 class MainWindow; 11 } 12 13 class MainWindow : public QMainWindow 14 { 15 Q_OBJECT 16 17 public: 18 explicit MainWindow(QWidget *parent = 0); 19 ~MainWindow(); 20 21 private: 22 void init(); 23 24 private: 25 QFrame *m_pFrame; 26 Ui::MainWindow *m_pUI; 27 CustomComboBox *m_pComboBox; 28 }; 29 30 #endif // MAINWINDOW_H
(2)mainwindow.cpp
1 #include "mainwindow.h" 2 #include "ui_mainwindow.h" 3 4 MainWindow::MainWindow(QWidget *parent) 5 : QMainWindow(parent) 6 , m_pUI(new Ui::MainWindow) 7 { 8 m_pUI->setupUi(this); 9 init(); 10 } 11 12 MainWindow::~MainWindow() 13 { 14 delete m_pUI; 15 } 16 17 void MainWindow::init() 18 { 19 // TODO ....实际应用复杂 20 m_pComboBox = new CustomComboBox(m_pFrame); 21 // TODO .... 22 }
1.4 main函数
(1)main.cpp
1 #include "mainwindow.h" 2 #include <QApplication> 3 4 int main(int argc, char *argv[]) 5 { 6 QApplication a(argc, argv); 7 MainWindow w; 8 w.show(); 9 10 return a.exec(); 11 }
【2】分析
2.1 崩溃堆栈
调试代码,异常堆栈是梳理问题的关键:由堆栈可定位发生问题的过程(即函数)。
2.2 局部对象
查看局部对象值,便于更具体的定位问题:由局部对象值可定位发生问题的对象(即成员变量)。
2.3 源码剖析(ps: 本地QT版本5.3,不同的QT版本,源码异常位置可能不同!)
QT源码分析(关于QT源码调试,参见随笔《QtCreator调试源码》),更具体查纠问题点:由源码可“知其然,更知其所以然”(即异常根本原因)
2.4 复原异常现场
结合以上所有的过程,弄清楚异常的来龙去脉。
【3】总结
切记,类中定义的指针成员变量,务必使用初始化列表规范进行强制初始化(默认置为NULL)。
Good Good Study, Day Day Up.
顺序 选择 循环 总结