1 问题描述
通过cmake + Visual Studio
编译MeshLab
源码,打开生成后的meshlab.exe
,此时若退出软件,或执行一些简单的操作,如导入点云、移动点云等,debug
版本软件将崩溃,报错ASSERT:"group->context == q_ptr" in file qgl.cpp
,其实release
版本也有该问题,只是assert
断言错误在release
下不崩溃而已,如图:
注:但是当执行
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^,笔者也只想安安静静看看里面的算法,强迫症看到这样的崩溃问题又不能不管,哎,就这样吧,本身也不影响使用。