当前位置: 首页 > news >正文

在视图中交互 闪退问题

程序闪退

//void mouseEventOccurred(const pcl::visualization::MouseEvent &event,
//	void* viewer_void)
//{
//	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);
//	if (event.getButton() == pcl::visualization::MouseEvent::LeftButton &&
//		event.getType() == pcl::visualization::MouseEvent::MouseButtonRelease)
//	{
//		std::cout << "Left mouse button released at position (" << event.getX() << ", " << event.getY() << ")" << std::endl;
//
//		char str[512];
//		sprintf(str, "text#%03d", text_id++);
//		viewer->addText("clicked here", event.getX(), event.getY(), str);
//	}
//}
//
//boost::shared_ptr<pcl::visualization::PCLVisualizer> interactionCustomizationVis()
//{
//	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
//	viewer->setBackgroundColor(0, 0, 0);
//	viewer->addCoordinateSystem(1.0);
//
//	viewer->registerKeyboardCallback(keyboardEventOccurred, (void*)&viewer);
//	viewer->registerMouseCallback(mouseEventOccurred, (void*)&viewer);
//
//	return (viewer);
//}

这个程序闪退可能有几个原因,我来帮你分析一下:

指针转换问题‌:

boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);


这里直接将viewer_void转换为shared_ptr指针可能有风险。建议改为:


boost::shared_ptr<pcl::visualization::PCLVisualizer>* viewer = static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer>*>(viewer_void);


回调函数注册问题‌:
在interactionCustomizationVis()中,你传入了&viewer的地址,但viewer本身就是一个shared_ptr,这可能导致双重引用。

内存管理问题‌:
确保在调用这些函数时,返回的viewer被正确持有,不会被过早释放。

PCL版本兼容性‌:
不同版本的PCL可能在回调处理上有差异,检查你使用的PCL版本文档。

建议修改方案:


void mouseEventOccurred(const pcl::visualization::MouseEvent &event, void* viewer_void)
{
    auto viewer = static_cast<pcl::visualization::PCLVisualizer*>(viewer_void);
    if(event.getButton() == pcl::visualization::MouseEvent::LeftButton &&
       event.getType() == pcl::visualization::MouseEvent::MouseButtonRelease)
    {
        std::cout << "Left mouse button released at position (" << event.getX() << ", " << event.getY() << ")" << std::endl;
        
        char str[512];
        sprintf(str, "text#%03d", text_id++);
        viewer->addText("clicked here", event.getX(), event.getY(), str);
    }
}

boost::shared_ptr<pcl::visualization::PCLVisualizer> interactionCustomizationVis()
{
    auto viewer = boost::make_shared<pcl::visualization::PCLVisualizer>("3D Viewer");
    viewer->setBackgroundColor(0, 0, 0);
    viewer->addCoordinateSystem(1.0);
    
    viewer->registerKeyboardCallback(keyboardEventOccurred, viewer.get());
    viewer->registerMouseCallback(mouseEventOccurred, viewer.get());
    
    return viewer;
}


主要修改点:

直接传递viewer的原始指针(get())给回调函数
使用更安全的boost::make_shared
简化了指针转换逻辑

如果仍有问题,建议:

检查是否有异常抛出
在调试模式下运行,查看崩溃时的调用栈
确保所有PCL依赖项正确安装和链接

相关文章:

  • 有哪些和PPT自动生成有关的MCP项目?
  • 多实例情况下,实例名较长dbca失败
  • TimDbg
  • Shell脚本-随机数实战案例
  • 排序--数据结构初阶(4)(C/C++)
  • Vuex(二) —— 用Vuex完成购物车案例
  • Python3:Jupyterlab 安装和配置
  • yolov5 源码 +jupyter notebook 笔记 kaggle
  • 贪心算法-2208.将数组和减半的最小操作数-力扣(LeetCode)
  • 喷泉码在物联网场景下的案例分析
  • 安达发|高效智能塑料切割数控系统 - 全自动化软件解决方案
  • 使用python实现自动化拉取压缩包并处理流程
  • 怎么样才能在idea中写入spark程序
  • 如何在 IntelliJ IDEA 中编写 Speak 程序
  • 2023ICPC合肥题解
  • 深入解读:2024数据资产场景化评估案例手册(第二期)【附全文阅读】
  • Linux中的系统延时任务和定时任务与时间同步服务和构建时间同步服务器
  • 大模型的scaling laws:Scaling Laws for Neural Language Models
  • Prompt Engineering 提示工程:释放大语言模型潜力的关键技术与实践指南
  • 大语言模型(LLMs)微调技术总结
  • 日趋活跃!2024年我国数据生产总量同比增长25%
  • 演员刘美含二手集市被曝售假,本人道歉
  • 西湖大学本科招生新增三省两市,首次面向上海招生
  • 法治日报调查直播间“杀熟”乱象:熟客越买越贵,举证难维权不易
  • 科学时代重读“老子”的意义——对谈《老子智慧八十一讲》
  • 新任海南琼海市委副书记陈明已主持市政府党组全面工作