在视图中交互 闪退问题

程序闪退

//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依赖项正确安装和链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值