当前位置: 首页 > 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依赖项正确安装和链接

http://www.xdnf.cn/news/194365.html

相关文章:

  • 1. 用户之窗
  • 【阿里云大模型高级工程师ACP习题集】2.6.用插件扩展答疑机器人的能力边界
  • IEC 61850标准协议解读 2.基于Java的MMS实现
  • Python爬虫实战:获取猫yan电影网最新热门电影数据并做分析,为51观影做参考
  • ArcGIS arcpy代码工具——根据属性结构表创建shape图层
  • OpenGL----OpenGL纹理与纹理缓存区
  • ICH CTD中ISS的关键内容与作用
  • ubuntu新增磁盘挂载
  • 如何将现有资源导入到 Terraform 管理?
  • BT131-ASEMI无人机专用功率器件BT131
  • 【更新】LLM Interview (2)
  • [特殊字符] 基于Docker部署Nacos注册中心及微服务注册发现详解(含MySQL持久化配置)
  • Android常见仓库与国内仓库对应关系
  • MaxScript二维图形布尔(并)运算
  • Hadoop和Spark大数据挖掘与实战
  • JQuery 使用技巧
  • Leetcode - 双周赛155
  • UE 滚动提示条材质制作
  • 遥控器双频天线技术及信号传输科普!
  • Linux进程7-signal信号处理方式验证、可重入函数举例、信号集函数验证、信号集阻塞验证
  • K8S学习笔记01
  • 嵌入式面试八股文(十二)·FreeRTOS中·堆和栈
  • Oracle备份和恢复
  • 论文速报《Enhancing Autonomous Driving Systems...:LLM-MPC混合架构增强自动驾驶》
  • C语言基础—(函数,指针与形参实参,字符串与指针,结构体)
  • Golang|使用函数作为参数和使用接口的联系
  • 23种设计模式
  • STM32N6570-DK ISP调试
  • UDP 报文结构与注意事项总结
  • 每日c/c++题 备战蓝桥杯(P1093 [NOIP 2007 普及组] 奖学金)