【调试记录】C++中,main函数功能正常但退出时报段错误的排查与解决

错误程序(示例)如下:

//myclass.h
class MyClass {
public:
    static int m_staticVar;
    int m_var;
    void SetMember(int value);
 };
int MyClass::m_staticVar = 0;
//myclass.cpp
#include "myclass.h"
void MyClass::SetMember(int value)
{
	this->m_var=value;
}
//myclass_main.cpp
#include "myclass.h"
int main()
{
	return 0;
}
# 编译
g++ -o myclass_main myclass.cpp myclass_main.cpp

此程序的错误在于,myclass.h定义了一个静态成员变量m_staticVar,并在文件末尾进行了初始化。这种写法可能会导致链接问题,因为静态成员变量的初始化应该放在源文件myclass.cpp中。

按道理说,这个错误应当在编译时报错。然而不知道为什么,编译通过了。这是shit山项目代码的一部分,整个项目能正常运行,只是在每次ctrl+c结束运行时,弹出一个“段错误”。这个段错误并不影响功能,但看着实在难受。于是我排查了好久找到了问题所在,并记录下来以备不时之需。
未经验证的成因猜测:1.与ROS多线程有关?2.工作空间中有之前成功编译的记录,catkin_make识别到这部分代码“曾经编译通过且代码内容无变化“所以基于节省资源加速编译的逻辑跳过了这部分编译?但a.如果之前代码也这样,为什么之前可以通过?是编译器版本差异?b.如果之前代码不是这样,为什么识别不到改动?为什么没有重新编译?c.我记得尝试过删除build和devel目录,再执行catkin_make,仍然没有报错,这就推翻了这个猜测的前提条件。
无法复现,不再深究。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值