ros&c++遇到的坑(vector 引起segmentation fault )

本文分享了在ROS环境中使用C++编程时遇到的问题及解决办法,包括如何正确配置第三方库链接、理解vector对象的使用限制,以及无符号字符类型在输出时的行为特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录今日调bug问题:

(1)ros 编译时需要CmakeList.txt,里面target_lik_libraries一项,如果在第三方链接库,需要在这里手动加上!完整的地址。

最开始我以为只要在catkin_ws工作空间/devel/lib里面放进去第三方库,然后在cmakelist里面target_link_libraries里添加catkin_libraris(就是默认的那个)就可以了,

编译一直报错 undefined reference to ......

挥泪...

(2)c++用vector类时,定义对象后,虽然说是会给分配一定的内存,但是!这个依然是无法访问的!

所以vector<int> x; 是不可以对x直接赋值或者访问,一定要push_back()进去东西,否则访问空vector就会出现段错误.

类似x[0]=1这样的赋值操作也是不可以的。

而且这个错误是可以编译过的,就是跑不起来

关于vector,移步 http://www.jb51.net/article/44234.htm

(3)unsigned char无符号字符在输出/打印会被作为ascii码打印的。。。。


有机会再看看原理写写


总之呢~!我的C++还是处于小学生水平!

[New Thread 0x7fffe62b0640 (LWP 93378)] [INFO] [1752816588.865113102] [imu_camera_sync]: IMU and Camera Sync Node started [INFO] [1752816588.865206898] [imu_camera_sync]: Waiting for synchronized IMU and Image data... Thread 1 "imu_camera_sync" received signal SIGSEGV, Segmentation fault. 0x00005555555a10c2 in ImuCameraSync::imu_callback(std::shared_ptr<sensor_msgs::msg::Imu_<std::allocator<void> > >) () (gdb) bt #0 0x00005555555a10c2 in ImuCameraSync::imu_callback(std::shared_ptr<sensor_msgs::msg::Imu_<std::allocator<void> > >) () #1 0x0000555555584107 in std::_Function_handler<void (std::shared_ptr<sensor_msgs::msg::Imu_<std::allocator<void> > >), std::_Bind<void (ImuCameraSync::*(ImuCameraSync*, std::_Placeholder<1>))(std::shared_ptr<sensor_msgs::msg::Imu_<std::allocator<void> > >)> >::_M_invoke(std::_Any_data const&, std::shared_ptr<sensor_msgs::msg::Imu_<std::allocator<void> > >&&) () #2 0x0000555555583043 in std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<std::__detail::__variant::__deduce_visit_result<void> (*)(rclcpp::AnySubscriptionCallback<sensor_msgs::msg::Imu_<std::allocator<void> >, std::allocator<void> >::dispatch(std::shared_ptr<sensor_msgs::msg::Imu_<std::allocator<void> > >, rclcpp::MessageInfo const&)::{lambda(auto:1&&)#1}&&, std::variant<std::function<void (sensor_msgs::msg::Imu_<std::allocator<void> > const&)>, std::function<void (sensor_msgs::msg::Imu_<std::allocator<void> > const&, rclcpp::MessageInfo const&)>, std::function<void (rclcpp::SerializedMessage const&)>, std::function<void (rclcpp::SerializedMessage const&, rclcpp::MessageInfo const&)>, std::function<void (std::unique_ptr<sensor_msgs::msg::Imu_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::Imu_<std::allocator<void> > > >)>, std::function<void (std::unique_ptr<sensor_msgs::msg::Imu_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::Imu_<std::allocator<void> > > >, rclcpp::MessageInfo const&)>, std::function<void (std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >)>, std::function<void (std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::Seri--Type <RET> for more, q to quit, c to continue without paging--q Quit 怎么看到具体的代码位置阿?
07-19
我再使用多进程时,在下列代码中unsigned WINAPI MyThreadFunction(LPVOID lpParam) { while (openFlag) { UF_UI_lock_ug_access(UF_UI_FROM_CUSTOM); //给主线程加锁(不锁上的话,在点击应用后再点击调取命令会崩掉或死循环的可能) char message[256]; //错误信息 getVariableDir("VT_APPLICATION_DIR", czApplicationDir); if (!isDirHas(czApplicationDir)) { UF_UI_open_listing_window(); UF_UI_write_listing_window("读取 VT_APPLICATION_DIR 环境变量失败 \n"); return false; } char czCfgDataP[256]; //表格完整路径 strcpy_s(czCfgDataP, czApplicationDir); strcat_s(czCfgDataP, "\\data\\标准化配置\\设计标准配置表.xls"); if (!isDirHas_Chs(czCfgDataP)) { sprintf_s(message,"(%s)不存在 \n", czCfgDataP); UF_UI_open_listing_window(); UF_UI_write_listing_window(message); return false; } Book* book; if (!load(czCfgDataP, &book)) { sprintf_s(message, "加载(%s) 失败 \n", czCfgDataP); UF_UI_open_listing_window(); UF_UI_write_listing_window(message); book->release(); return false; } Sheet* voiceSheet;//声音数据页 if (!getSheet(book, "材料", &voiceSheet)) { UF_UI_open_listing_window(); UF_UI_write_listing_window("加载 (材料) 数据 失败 \n"); book->release(); return false; } vAllVoiceSt.clear(); vVoiceStr.clear(); if (!readStr_Col(voiceSheet, 0, vVoiceStr)) { UF_UI_open_listing_window(); UF_UI_write_listing_window("加载 (材料) 材质类型 失败 \n"); book->release(); return false; } for (size_t i = 0; i < vVoiceStr.size(); i++) { vector<CString>vTempStr; if (!readStr_Col(voiceSheet, i, vTempStr)) { continue; } vAllVoiceSt.push_back(vTempStr); break; } book->release(); HANDLE g_hMutex = CreateMutex(NULL, FALSE, NULL); if (vAllVoiceSt.size() && tempStrUi && openFlag) { string excelDate = (LPCSTR)(CStringA)(vAllVoiceSt[0][0]); if (!excelDate.empty()) { vector<NXString>tempStr; tempStr.push_back((NXString)excelDate.c_str()); tempStrUi->SetEnable(true); tempStrUi->SetValue(tempStr); tempStrUi->SetEnable(false); } else { vector<NXString>tempStr; tempStr.push_back(""); tempStrUi->SetEnable(true); tempStrUi->SetValue(tempStr); tempStrUi->SetEnable(false); } } ReleaseMutex(g_hMutex); UF_UI_unlock_ug_access(UF_UI_FROM_CUSTOM); //给主线程关锁 Sleep(500); // Simulate work with a sleep call. } return 0; } tempStrUi->SetValue(tempStr);这句代码总是会导致NX2206崩溃该如何解决?
最新发布
07-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值