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