QT构建窗体(父窗体传为野指针)异常案例

【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.

顺序 选择 循环 总结

 

posted @ 2018-03-15 23:14  kaizenly  阅读(1137)  评论(0编辑  收藏  举报
打赏