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

相关推荐
AI多Agent协作实战派15 小时前
AI多Agent协作系统实战(二十二):从6列到12列——任务监控报告的进化之路
java·人工智能·uni-app·bug
自然 醒17 小时前
记录We码开发者工具的一个bug
前端·javascript·bug
GeekArch1 天前
第28讲:避坑——AI堆栈分配错误、栈溢出BUG
c语言·人工智能·stm32·mcu·学习·bug
AI多Agent协作实战派1 天前
AI多Agent协作系统实战(十七):凌晨4点,我的AI系统在“假装工作“——3个bug同时爆炸的5小时
java·前端·bug
尸僵打怪兽2 天前
Claude-code命令行无法下载插件
bug·插件·claude-code
Liu.7743 天前
uni-app 组件 uni-easyinput 常见 Bug 及解决方案
uni-app·bug
QQ骞5 天前
【bug的管理流程深入浅出】
软件测试·bug
Rambo.xia5 天前
AXI跨时钟域与数据一致性——CDC FIFO深度不够、写后读冒险、多Master仲裁、乱序返回,出了Bug根本查不出来
fpga开发·bug
不知名的老吴5 天前
思考:要做到Bug Free需培养怎样的思维?
bug
河南花仙子科技8 天前
小游戏开发中常见的BUG类型及成因
人工智能·科技·游戏·bug