【1】源码

工作中,时常会遇到各种各样的异常场景,有些异常场景很常见,必要备录,以防再犯。

分享本案例为:QT创建窗体时parent父窗体传野指针引起异常。

本案例源码如下:

1.1 默认新建一个QT工程(ps:本地QT版本为5.3)

(1)工程目录结构

(2)工程pro文件

 QT       += core gui

 greaterThan(QT_MAJOR_VERSION, ): QT += widgets

 TARGET = CustomComboBox
TEMPLATE = app SOURCES += main.cpp\
mainwindow.cpp \
customcombobox.cpp HEADERS += mainwindow.h \
customcombobox.h FORMS += mainwindow.ui

1.2 实现自定义控件

(1)customcombobox.h

 #ifndef CUSTOMCOMBOBOX_H
#define CUSTOMCOMBOBOX_H #include <QComboBox> class CustomComboBox : public QComboBox
{
public:
CustomComboBox(QWidget* parent = NULL);
}; #endif // CUSTOMCOMBOBOX_H

(2)customcombobox.cpp

 #include "customcombobox.h"

 CustomComboBox::CustomComboBox(QWidget *parent)
: QComboBox(parent)
{
}

1.3 利用自定义控件

(1)mainwindow.h

 #ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QFrame>
#include <QMainWindow>
#include "customcombobox.h" namespace Ui
{
class MainWindow;
} class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = );
~MainWindow(); private:
void init(); private:
QFrame *m_pFrame;
Ui::MainWindow *m_pUI;
CustomComboBox *m_pComboBox;
}; #endif // MAINWINDOW_H

(2)mainwindow.cpp

 #include "mainwindow.h"
#include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, m_pUI(new Ui::MainWindow)
{
m_pUI->setupUi(this);
init();
} MainWindow::~MainWindow()
{
delete m_pUI;
} void MainWindow::init()
{
// TODO ....实际应用复杂
m_pComboBox = new CustomComboBox(m_pFrame);
// TODO ....
}

1.4 main函数

(1)main.cpp

 #include "mainwindow.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show(); return a.exec();
}

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

顺序 选择 循环 总结

QT构建窗体(父窗体传为野指针)异常案例的更多相关文章

  1. 使用AFNetworking时, 控制器点击返回销毁了, 但还是会执行请求成功或失败的block, 导致野指针异常

    原本我以为是我程序框架有问题...后来才知道, 无知真可怕... __unsafe_unretained __block typeof(self) weakSelf = self; AFHTTPSes ...

  2. C# 子窗体点击按钮产生的新子窗体放在父窗体里

    情景展示: 父窗体Form1,左边是按钮,右边是panel(放置子窗体) 父窗体点击按钮,在panel显示第一个子窗体AA, AA有个按钮,点击按钮,是第二个子窗体ZZ, 怎样将AA的子窗体ZZ也显示 ...

  3. 不创建父窗体的情况下他其他窗体的信息显示在第一个打开的窗体!(winfrom)

    公司使用vs2008做的东西,用vs2017都打不开了(编译错误) 叫我更新一下,我看了一下,08的项目 和 winform 差不多  如何就用winfrom来做了 (winform  很久没碰了,, ...

  4. Qt 子窗体嵌入父窗体

    1.创建个子窗体QDialog.在子窗体构造函数添加 Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { u ...

  5. 【QT】在子窗体中控制父窗体

    [背景说明]我的主窗体的名字叫做MainWindow,其子窗口是一个叫subDialog的类.我现在想做的是在子窗口的函数中调用父窗口. 在父窗口中打开子窗口 //弹出对话框确定变换的参数 subDi ...

  6. Qt — 子窗体操作父窗体中的方法

    父窗体与子窗体各自的代码如下: 1.  父窗体的代码: void FartherWindow::addactions() { SubWindow subwindow(this); // 把父窗体本身t ...

  7. qt 给父窗体设置样式不影响子控件样式以及子控件设置透明

    1.父窗体样式不生效? this->setAttribute(Qt::WA_StyledBackground); 2.父窗样式体影响子控件? this->setStyleSheet(&qu ...

  8. WPF用ShowDialog()弹出窗体时控制该窗体的显示位置,并传值回父窗体

    原文:http://blog.csdn.net/kiss0622/article/details/5852153 方法一: 1.父窗口代码 Window1.xaml.cs private void B ...

  9. 附实例!实现iframe父窗体与子窗体的通信

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由前端林子发表于云+社区专栏 本文主要会介绍如何基于MessengerJS,实现iframe父窗体与子窗体间的通信,传递数据信息.同时本 ...

随机推荐

  1. CF865D Buy Low Sell High 贪心

    正解:贪心 解题报告: 传送门! 这题首先有个很显然的dp,太基础了不说QAQ 然后考虑dp是n2的,显然过不去,所以换一个角度 然后发现这题和普通的dp的题有什么不同呢?就它这儿是一天只能买一支股, ...

  2. cuda9.0编译caffe报错nvcc fatal : Unsupported gpu architecture 'compute_70'

    Tesla V100 cuda9.0 caffe编译的时候报上述错误,修改方法: CUDA_ARCH := #-gencode arch=compute_20,code=sm_20 \ #-genco ...

  3. 常用的shell脚本(安全方向)

    更多shell脚本参考:https://blog.51cto.com/zero01/2046242 1.拒绝密码撞库攻击的ip shell脚本:实现对登录主机失败10次以上的ip进行拒绝登录 #! / ...

  4. Vue中 export default 和 export 区别

    1.export与export default均可用于导出常量.函数.文件.模块等2.在一个文件或模块中,export.import可以有多个,export default仅有一个3.通过export ...

  5. finecms如何调用多个指定栏目的内容

    想调用finecms多个栏目的内容,用英文状态下的逗号来分开多个id实现不了(catid=1,2,3),要如何写噢?后面ytkah想想这个跟sql语法有点一样,用IN_catid = 1,2,3果然成 ...

  6. HIVE简单操作

    1.hive命令登录HIVE数据库后,执行show databases;命令可以看到hive数据库中有一个默认的default数据库. [root@hadoop hive]# hive Logging ...

  7. shell编程awk基础介绍

    awk介绍 报告生成器,格式化文本输出 处理机制类似sed命令,自带循环处理    读入一行处理一行然后自动读取下一行再进行处理 sed命令换行的标识是固定的,只能是回车换行.    awk里面的换行 ...

  8. shell进阶函数

    函数的定义和用途 函数function是由若干条shell命令组成的语句块,实现shell代码的重用和模块化编程. 函数和shell程序的异同点 它与shell程序形式上是相似的,不同的是它不是一个单 ...

  9. 2017-2018-2 20165236 实验四《Android开发基础》实验报告

    2017-2018-2 20165236 实验四<Android开发基础>实验报告 一.实验报告封面 课程:Java程序设计       班级:1652班       姓名:郭金涛     ...

  10. function module 之间调用

    1: 在一个function group 中定义一个function module 2:在另外一个module中调用该module "调用其它function 要用 单引号 引着. 一个mo ...