- C++丢了很长时间了,没想到还有捡回来的一天,各种不适应,尤其是指针相关的,SIGSEGV这几天真没少见,总结下自己遇到的SIGSEGV case,下面这个可以作为一个check-list:
- null指针解引用,这个就不说了,解引用前自己做好预防。
- 要求返回值的函数实现时没有返回值,按理说IDE会提示,但是目前看AS很多时候是不会提示的。
- 使用RAII对象管理内存时,因为临时对象析构的原因导致RAII对象内管理的内存被释放,成了野指针。这一点一般比较隐秘,你能做的也就是尽量使用指针/引用,但不可能完全规避。打个比方,遍历提取数据时,经常会在外边声明一个临时的对象作为每次的提取容器,然后push_back到vector中,这个临时变量就是隐患。unique_ptr等智能指针也能减少这种隐患。
- 从Java等其他Class成员变量自动初始化的世界来到C++世界,可惜C++是不会替你初始化大部分成员变量的(除了static等特例),稳妥的做法就是在构造函数/初始化列表把所有的成员变量都初始化(当然了,类成员变量一般不用,但是前提是类成员变量自己的构造函数可靠的完成了自己的初始化)。
- 线程同步问题。其实这个不能说是root cause,只能说是一种可能诱因。线程同步的不对会导致任何的问题,SIGSEGV只是其中一种。比如你有一个Vector来盛放指针,你在线程A对Vector进行写操作(释放Vector保存的指针,并释放其指向的内存),在线程B对Vector进行读操作(解引用)。
C++ SIGSEGV check list
最新推荐文章于 2024-03-22 17:26:03 发布