当前位置: 首页 > news >正文

QT 控件定义为智能指针引发的bug

问题描述:

 std::unique_ptr<QStackedLayout> m_stacked_layout;

如上为定义; 

调用:

Line13ABClient::Line13ABClient(QWidget *parent)
    : BaseWidget(parent)
{
    // 成员变量初始化
    m_get_ready = false;
    m_tittle_wnd = nullptr;
    m_form_wdg = nullptr;
    m_surveillance_wnd = nullptr;

    m_form_wdg.reset(new QWidget(this));
    m_form_wdg->setObjectName("MainFormContainerWnd");
    m_stacked_layout.reset(new QStackedLayout(m_form_wdg.get()));
    m_form_wdg->setLayout(m_stacked_layout.get());
    m_stacked_layout.release();//放弃智能指针的所有权,交给m_form_wdg 否则,双重释放程序会崩溃

........

}

Line13ABClient::~Line13ABClient()
{
    //ExitSystem();// 不通过右上角X,直接关闭软件需要调用,否则会崩溃,原因是双重释放stacklayout
}
void Line13ABClient::ExitSystem()
{
    DynamicMsgBoxM::GetInstance().Clear();
    if (m_stacked_layout) {
        m_stacked_layout.reset();
    }
    .....

}

如上述所示,m_stacked_layout 定义为了一个智能指针,但是m_form_wdg->setLayout(m_stacked_layout.get());  之后,按理说setlayout之后所有权交给了m_form. 不需要再析构函数中再次清除m_stacked_layout,  但是实际情况是,程序直接关闭,程序崩溃!

原因就是 m_stacked_layout的所有权混乱了。建议直接将m_stacked_layout定义为裸指针 QStackLayout* 。智能指针使用慎重!

如果 std::unique_ptr<QStackedLayout> 也尝试管理同一个 QStackedLayout 对象,那么当 std::unique_ptr 被销毁时,它也会尝试释放这个对象,导致双重释放或未定义行为。

最后,QT 控件还是建议使用父子关系来管理内存,不要使用智能指针!

http://www.lryc.cn/news/508933.html

相关文章:

  • Scala项目(图书管理系统)
  • 前端开发 详解 Node. js 都有哪些全局对象?
  • 2024_12_20_生活记录
  • Sequelize ORM 现有表如何使用
  • ArcGIS Pro 3.4新功能3:空间统计新特性,基于森林和增强分类与回归,过滤空间自相关
  • H3C MPLS跨域optionB
  • 源码分析之Openlayers中Geometry基类介绍
  • 《Vue3 三》Vue 中的 options 选项
  • Elasticsearch 国产化替代方案之一 Easysearch 的介绍与部署指南
  • Pytorch | 从零构建EfficientNet对CIFAR10进行分类
  • Python超能力:高级技巧让你的代码飞起来
  • 熊军出席ACDU·中国行南京站,详解SQL管理之道
  • FPGA实现MIPI转FPD-Link车载同轴视频传输方案,基于IMX327+FPD953架构,提供工程源码和技术支持
  • vue3动态绑定图片和使用阿里巴巴矢量图
  • ‘vite‘ 不是内部或外部命令,也不是可运行的程序
  • 2024年12月一区SCI-加权平均优化算法Weighted average algorithm-附Matlab免费代码
  • 如何获取 ABAP 内表中的重复项
  • 编译笔记:vs 中 正在从以下位置***加载符号 C# 中捕获C/C++抛出的异常
  • ChatGPT与Postman协作完成接口测试(二)
  • flask-admin modelview 中重写get_query函数
  • 【python 逆向分析某有道翻译】分析有道翻译公开的密文内容,webpack类型,全程扣代码,最后实现接口调用翻译,仅供学习参考
  • tensorflow_probability与tensorflow版本依赖关系
  • 构建安全的用户认证系统:PHP实现
  • VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比
  • 天融信网络架构安全实践
  • 腾讯云云开发 Copilot具有以下优势
  • electron-vite【实战系列教程】
  • 【微信小程序】微信小程序中的异步函数是如何实现同步功能的
  • 贪心算法(三)
  • uniApp打包H5发布到服务器(docker)