【日常遇坑总结】类成员变量的空间分配和初始化顺序

2023-10-31

遇坑

今天在用QT的时候,传从主ui页面创建的一个指针到建模ui页面,在运行时程序发生奔溃。经过测试发现问题,主页面的指针和传进建模页面的指针不是同一个,导致在调用类指针方法时发生错误。

测试

以下代码仅展示测试代码的部分,不可运行。但能从下面代码可以说明主题的遇坑经过,以及解决问题方法,从而进行总结。

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "template_management.h"
#include "box_api.h"
#include <memory.h>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    // 主页面
    Ui::MainWindow *ui;
    // 模板管理
    template_management *template_management_interface = new template_management(box_api_);
    // 数据库、日志接口
    BoxApi *box_api_ = new BoxApi;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDesktopWidget>
#include <QCompleter>
#include <QKeyEvent>
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsItem>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    box_api_->init();  // 初始化数据和日志
    std::cout <<  "box_api_1: " << box_api_ << std::endl;  // 打印地址
}

MainWindow::~MainWindow()
{
    delete ui;
    delete template_management_interface; // 模板管理
}

template_management.h

#ifndef TEMPLATE_MANAGEMENT_H
#define TEMPLATE_MANAGEMENT_H

#include <QWidget>
#include "customsense.h"
#include <memory>
#include <QLabel>
#include <QDebug>
#include <QPushButton>
#include "enum_type.h"
#include "box_api.h"

namespace Ui {
class template_management;
}

class template_management : public QWidget
{
    Q_OBJECT

public:
    explicit template_management(BoxApi *box_api = nullptr, QWidget *parent = nullptr);
    ~template_management();

private:
	Ui::template_management *ui;
	BoxApi *box_api_;
};

#endif // TEMPLATE_MANAGEMENT_H

template_management.cpp

#include "template_management.h"
#include <QDesktopWidget>
#include "ui_template_management.h"

template_management::template_management(BoxApi *box_api, QWidget *parent) :
    QWidget(parent), ui(new Ui::template_management), box_api_(box_api)
{
    ui->setupUi(this);
    std::cout <<  "box_api_2: " << box_api_ << std::endl;  // 打印地址
}

template_management::~template_management()
{
    delete ui;
}

程序运行结果:

box_api_2: 0x11b7a00
box_api_1: 0x30698840

由上可知,传递的地址不一样。故将mainwindow.h的内容进行更改,将成员变量BoxApi *box_api_ = new BoxApi; 放到创建建模页面之前。
更改后的mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "template_management.h"
#include "box_api.h"
#include <memory.h>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    // 主页面
    Ui::MainWindow *ui;
     // 数据库、日志接口
    BoxApi *box_api_ = new BoxApi;
    // 模板管理
    template_management *template_management_interface = new template_management(box_api_);
};
#endif // MAINWINDOW_H

运行结果

box_api_2: 0x2b293020
box_api_1: 0x2b293020

这次两个地址一样了。

总结

由测试可知:创建一个类,首先类对成员变量进行空间分配(此时成员变量没有进行初始化)。然后成员变量按申明顺序进行初始化,值可以从直接赋值得到以及从初始化列表进行构造得到(成员变量的初始化顺序只取决于成员变量的声明顺序和列表的初始化顺序无关)。最后才执行构造函数的函数体。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【日常遇坑总结】类成员变量的空间分配和初始化顺序 的相关文章

随机推荐

  • 移动端前端适配方案(总结) -- 面试重点

    在网上搜了一下 很多面试都会被问到移动端适配方法的问题 最近看了一些文章 这里总结一下 首先 谈一下目前为止出现的一些关于移动端适配的技术方案 1 通过媒体查询的方式即CSS3的meida queries 2 以天猫首页为代表的 flex
  • Android动态申请权限知识

    1 Android6 0 APIlevel23 开始targetSdkVersion gt 23的应用必须在运行时动态申请权限 2 权限请求对话框是操作系统进行管理的 应用无法也不应该干预 3 系统对话框描述的是权限组而不是某个具体权限 4
  • cgwin 中国镜像

    2019独角兽企业重金招聘Python工程师标准 gt gt gt http mirrors 163 com cygwin 转载于 https my oschina net famoustone blog 886193
  • DLNA的一个场景的工作过程

    场景 用户将手机A中的媒体内容播放到电视B上 DMC DMR 在这个场景中 前提是 A和B必须连接到同一个局域网中 假定电视B先接入局域网 手机A后接入局域网 然后再进行播放操作 那么该场景大概是这样的 B接入局域网以后 B需要建立多播so
  • 电脑设置定时关机的5种方法

    转自 微点阅读 https www weidianyuedu com 方法汇总于网络 仅供参考 目录 如何用系统命令设置定时关机 两款定时关机软件 小而好用 功能强大 如何用任务计划程序设置 常用的电脑软件如何设置 包括360安全卫士 迅雷
  • Java中以英文逗号分割的字符串在前端添加时正则判断

    Java中以英文逗号分割的字符串在前端添加时正则判断 只能是英文状态逗号且只能以逗号隔开不能以逗号结尾 只能是英文状态逗号 不能有中文逗号 var m uff0c if goodstype match m alert 不能有中文逗号 ret
  • sql注入之万能密码总结

    万能密码 万能密码原理 原验证登陆语句 SELECT FROM admin WHERE Username username AND Password md5 password 输入 1 or 1 1 or 1 1万能密码语句变为 SELEC
  • systemd启动mysql后一直卡住,Systemd Mysql不会停止

    升级到15 04后 我有很多乐趣了解systemd 我想我一切正常 除了我无法阻止mysql service systemctl命令只是挂起而且mysql一直在运行 有没有其他人经历过这个或者可能知道发生了什么 解决方法 我有同样的问题 升
  • 蓝桥杯.剪格子(DFS)

    Question Solve 深搜板子题 分成两部分 两部分的数字和相同 dfs去创造路径 然后比对路径上的数字和与剩余点的数字和 优化点 读入时候先求和sum 路径和ans另算 直接去判断ans是不是sum的一半 ans gt sum 2
  • 理解fasterRCNN模型的构成,并进行训练和预测

    学习目标 了解VOC数据集的应用 理解fasterRCNN模型的构成 能够利用fasterRCNN网络模型进行训练和预测 1 VOC数据集简介 Pascal VOC数据集作为基准数据 在目标检测中常被使用到 很多优秀的计算机视觉模型比如分类
  • 逆向图片搜索 搜索自己想搜索的

    Tineye 是一个用图片搜索图片的技术 http www tineye com 开始时Tineye是邀请注册 后来是开放注册 不过都需要注册才能使用 现在终于完全放开 无需再注册或登录即可使用该搜索引擎 此外 Tineye最近还增添了一下
  • Vue+ElementUI el-radio列表单选

    实现效果 对某条数据进行数据修改 步骤 1 添加单选按钮 点击获取该条信息的id 并将id传给修改按钮 div 1 修改按钮 span size mini 修改信息 span 2 列表单选按钮
  • OptiSystem应用:光放大器EDFA的仿真

    Optisystem可以设计和模拟光纤放大器和光纤激光器 此处展示的案例可在Optisystem安装文件夹samplesOptical amplifiers中找到 该教程将会介绍光放大器库这一部分 光放大器 全局参数 使用Optisyste
  • Linux系统下Java 转换Word到PDF时,结果文档内容乱码的解决方法

    本文分享在Linux系统下 通过Java 程序代码将Word转为PDF文档时 结果文档内容出现乱码该如何解决 具体可参考如下内容 1 问题出现的背景 在Windows系统中 使用Spire Doc for Java将Word文档转换为PDF
  • [深度学习入门]Python基础语法(上)

    目录 一 程序设计基本方法 1 计算机是根据指令操作数据的设备 2 编程设计语言概述 3 计算机编程 4 IPO程序编写方法 5 使用计算机解决问题 二 基础知识 1 pyCharm 为人工智能领域常用的IDE 2 Python的简单使用
  • NVIDIA Shield 消失的解决办法和Moonlight串流

    Foreword 之前有用Moonlight串口pc的游戏到公司电脑 然后突然有一天串流就不可用了 NVIDIA Shield 就消失了 怎么都开不起来 串流就失败了 然后也记录一下Moonlight串流的操作 由于NVIDIA单方面宣布停
  • vue+element 根据状态,显示不同的操作按钮

    效果截图 VUE 核心功能代码片段
  • 【yolov5】yolov5训练自己的数据集全流程----包含本人设计的快速数据处理脚本

    关于yolo应用时能用到的脚本集合 推荐收藏 https chenlinwei blog csdn net article details 127299428 文章目录 1 工程化快速yolo训练流程指定版 无讲解 1 1 抽样数据集 xm
  • Spring MVC中如何进行转发和重定向呢?

    转自 Spring MVC中如何进行转发和重定向呢 重定向 我们将用户的定向到另一个视图 jsp 中处理 此操作是一个客户端行为 类似与url的链接操作 转发 将用户的请求转发到另一个视图或controller处理 此操作是一个服务器端行为
  • 【日常遇坑总结】类成员变量的空间分配和初始化顺序

    遇坑 今天在用QT的时候 传从主ui页面创建的一个指针到建模ui页面 在运行时程序发生奔溃 经过测试发现问题 主页面的指针和传进建模页面的指针不是同一个 导致在调用类指针方法时发生错误 测试 以下代码仅展示测试代码的部分 不可运行 但能从下