MeshLab退出崩溃,报错ASSERT:“group->context == q_ptr“ in file qgl.cpp

1 问题描述

通过cmake + Visual Studio编译MeshLab源码,打开生成后的meshlab.exe,此时若退出软件,或执行一些简单的操作,如导入点云、移动点云等,debug版本软件将崩溃,报错ASSERT:"group->context == q_ptr" in file qgl.cpp,其实release版本也有该问题,只是assert断言错误在release下不崩溃而已,如图:
image.png

注:但是当执行filter中的一些操作,如计算点云法向量后,此时再退出软件,将不产生崩溃。

2 问题原因及分析

MeshLab作者给的回复是Qt版本的问题,Qt6之后就没有该问题了,笔者的Qt版本是5.14.2,笔者没有尝试重新安装Qt6,而是自己分析程序崩溃的位置;
调用堆栈发现程序崩溃的位置在src\meshlab\multiViewer_Container.cpp文件中的MultiViewer_Container::~MultiViewer_Container(),即MultiViewer_Container类的析构函数,源码如下:

MultiViewer_Container::~MultiViewer_Container()
{
    /*for(int ii = 0;ii < viewerList.size();++ii)
        delete viewerList[ii];*/
	
    //WARNING!!!! here it's just destroyed the pointer to the MLSceneGLSharedDataContext
    //the data contained in the GPU are deallocated in the closeEvent function
	delete scenecontext;
}

执行语句delete scenecontext;后并没有产生崩溃,也就是说,是在析构MultiViewer_Container类自身的成员变量或父类析构函数或父类成员变量时出现了问题,调用堆栈发现进一步崩在MultiViewer_Container父类Splitter的析构函数(空函数),Splitter的父类是QSplitter,是Qt中的一个类,再进一步就需要分析Qt的源码了,笔者没有精力再继续查下去了。

3 解决方案

笔者发现MeshLab作者在MultiViewer_Container::~MultiViewer_Container()函数中,加了一段注释,虽然没有很理解,但反倒给了笔者提醒,是否是重复释放同一块内存导致的崩溃,或者释放内存后导致指针为空影响了后面的判断,结果就注释了语句delete scenecontext;结果竟然不崩了,如下:

MultiViewer_Container::~MultiViewer_Container()
{
    /*for(int ii = 0;ii < viewerList.size();++ii)
        delete viewerList[ii];*/
	
    //WARNING!!!! here it's just destroyed the pointer to the MLSceneGLSharedDataContext
    //the data contained in the GPU are deallocated in the closeEvent function
	/*
	* modified by wangchenxue at 2022.06.10
	* 注释了"delete scenecontext;",添加"scenecontext = NULL;"
	* 否则debug版本在退出时,会崩掉,给出报错信息ASSERT("group->context == q_ptr")
	* 虽然有效,但这不是解决问题的好办法
	*/
	// delete scenecontext;	
	scenecontext = NULL;
}

虽然确实有效,但这不是解决问题的好办法,可能会存在内存泄漏,不过该问题也就在关闭MeshLab的时候才会出现,泄漏就泄漏吧,^V^,笔者也只想安安静静看看里面的算法,强迫症看到这样的崩溃问题又不能不管,哎,就这样吧,本身也不影响使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值