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

解决QSharedPointer栈变量的崩溃问题

目录

  • 参考
  • 崩溃
    • 代码
    • 现象
  • 解决

参考

QSharedPointer的陷阱

qt中的共享指针,QSharedPointer类

崩溃

代码

#include <QtCore/QCoreApplication>
#include <QDebug>
#include <QSharedPointer>

class MyClass {
public:
	void doSomething() {
		qDebug() << __FUNCTION__;
	}
};
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

	{
		MyClass stackObj;          // 栈对象,生命周期由作用域管理
		QSharedPointer<MyClass> ptr(&stackObj); // 错误!QSharedPointer 会尝试 delete 栈对象
		ptr->doSomething();
	}
	
    return a.exec();
}

现象

  1. Qt\5.15.2\msvc2019_64\include\QtCore\qsharedpointer_impl.h
    析构
    1
    2外部部引用计数数据
    3
    外部部引用计数数据的删除器
    在这里插入图片描述
    自定义删除器
    在这里插入图片描述

  2. C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.41.34120\crt\src\vcruntime\delete_scalar_size.cpp
    在这里插入图片描述

  3. C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.41.34120\crt\src\vcruntime\delete_scalar.cpp

解决

  • 特殊情况:自定义删除器(非栈对象)
    如果确实需要管理非 new 创建的资源,可以通过自定义删除器避免 delete
QSharedPointer<MyClass> ptr(&stackObj, [](MyClass*) {
    // 空删除器,不执行 delete
});

但这种情况极少见,且需确保栈对象的生命周期长于 QSharedPointer

#include <QtCore/QCoreApplication>
#include <QDebug>
#include <QSharedPointer>

class MyClass {
public:
	void doSomething() {
		qDebug() << __FUNCTION__;
	}
};
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

	{
#if 1
		MyClass stackObj;						// 栈对象,生命周期由作用域管理
#if 0
		QSharedPointer<MyClass> ptr(&stackObj); // 错误!QSharedPointer 会尝试 delete 栈对象
#else
		QSharedPointer<MyClass> ptr(&stackObj, [](auto*) {
			// 空删除器,不执行 delete
	});
#endif
#else
		QSharedPointer<MyClass> ptr(new MyClass());// 正常
#endif

		ptr->doSomething();
	}
	
    return a.exec();
}

相关文章:

  • 下载并安装 Nacos
  • R语言入门课| 04 R语言基本函数
  • 30、web前端开发之CSS3(七-综合实战案例)
  • 【linux】配置YUM/DNF仓库
  • 远心镜头原理
  • 受控组件和非受控组件的区别
  • QT Quick(C++)跨平台应用程序项目实战教程 5 — 界面设计
  • 张量-pytroch基础(2)
  • 数据结构实验1.1: 顺序表的操作及其应用
  • MTU / IP MTU / PMTU / MSS:理解它们的区别与联系
  • KM算法识别语音数字0-9
  • FreeCAD傻瓜教程-利用Python从代码复制粘贴生成零件
  • Shell 不神秘:拆解 Linux 命令行的逻辑与效率
  • 禁用微软输入法的简繁体切换
  • 别怕!51 单片机从入门到应用,小白也能轻松吃透
  • 快速上手Linux系统输入输出
  • 基于SVPWM和Park变换的异步电机转速控制系统simulink建模与仿真
  • 【Pandas】pandas DataFrame
  • 地图(八)利用python绘制散点地图
  • Spark,配置hadoop集群1
  • 乌海网站制作/cps推广平台
  • 网站内套网站代码/网站策划书
  • 怎样做销售水蜜桃网站/seo百度站长工具查询
  • 有没有专门做教程的网站/网络营销毕业论文范文
  • 装修设计师培训班/seo推广灰色词
  • 网站建设公司格/济南网络推广公司电话