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_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 控件还是建议使用父子关系来管理内存,不要使用智能指针!

相关推荐
中冕—霍格沃兹软件开发测试10 小时前
测试工具链的构建与团队协作:从工具集成到价值流动
人工智能·科技·测试工具·开源·appium·bug
yuxuan669913 小时前
【Docker】使用docker启动禅道出现mysql.sock 文件已经存在的bug
mysql·docker·centos·bug
zfxwasaboy14 小时前
BUG: failure at drivers/pci/msi.c:376/free_msi_irqs()!
linux·c语言·bug
yscript14 小时前
GPU分配BUG: Duplicate GPU detected : rank 1 and rank 0 both on CUDA device d5000
linux·运维·服务器·vscode·bug
xiucai_cs14 小时前
【后端】开发过程中如何尽可能的减少 bug 的产生
后端·bug
大江东去浪淘尽千古风流人物14 小时前
【bug】bug记录学习,Win系统下爆栈的表现, chkstk.asm 实际是栈溢出
学习·bug
木棉知行者2 天前
【第2篇】RuntimeError: nms_impl: implementation for device cuda:0 not found.
人工智能·深度学习·bug·mmdetection
DB!!!2 天前
【bug】系统CA证书毁坏导致找不到有效的 OpenPGP 数据
bug
中冕—霍格沃兹软件开发测试2 天前
测试用例库建设与管理方案
数据库·人工智能·科技·开源·测试用例·bug
lvchaoq2 天前
解决组件不能远程搜索的问题
前端·bug