【调试记录】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,仍然没有报错,这就推翻了这个猜测的前提条件。
无法复现,不再深究。

解决C++中`int main()`函数语法错误可采用以下方法: #### 利用编译器提示 现代编译器在编译代码时,若存在语法错误,会输出详细的错误信息,包括错误发生的位置(行号和列号)以及可能的错误原因。仔细阅读这些信息,能够定位并修正错误。例如,对于如下代码: ```cpp #include <iostream> int main() { int a = 1 return 0; } ``` 编译器可能会提示在`int a = 1`这一行缺少分号。根据提示,在该行末尾添加分号即可解决问题: ```cpp #include <iostream> int main() { int a = 1; return 0; } ``` #### 代码审查 逐行检查代码,查看是否存在拼写错误、缺少分号、括号不匹配等常见语法问题。例如,检查函数名、变量名是否拼写正确,语句结尾是否有分号,括号、花括号是否成对出现。以下是一个括号不匹配的错误示例: ```cpp #include <iostream> int main() { if (true { std::cout << "Hello, World!" << std::endl; } return 0; } ``` 通过仔细审查,可以发现`if (true`后面缺少右括号,修正后的代码如下: ```cpp #include <iostream> int main() { if (true) { std::cout << "Hello, World!" << std::endl; } return 0; } ``` #### 使用代码编辑器或IDE的语法检查功能 许多代码编辑器和集成开发环境(IDE)都提供了实时语法检查功能,能够在编写代码的过程中实时标记出语法错误。例如,Visual Studio Code、CLion等都可以通过安装相应的C++扩展来实现语法检查。当代码中存在语法错误时,编辑器会在错误位置下方显示波浪线,并给出提示信息。 #### 参考文档和示例代码 当遇到不确定的语法问题时,可以查阅C++官方文档、教程或参考其他优秀的示例代码。了解正确的语法使用方法,对比自己的代码,找出错误所在。 #### 单元测试和调试 将代码分割成小的单元进行测试,逐步排查问题。可以使用调试工具(如GDB、Visual Studio的调试器等)来单步执行代码,观察程序的执行流程和变量的值,帮助发现隐藏的语法错误。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值