我正在编写一个客户机-服务器守护程序,该守护程序必须接受并转换特定的消息格式,检查它们是否提交以将所有 Activity 提交给DB。程序是多线程的。因此,我开始工作,并在某些情况下开始获得SIGSEGV。因此,我不得不重新设计程序并重新开始。
我想知道,是否有任何“最佳实践”或如何使SIGSEGV风险最小化的提示?
我知道,应该在使用前检查每个指针,并在删除后检查它是否为空,但是如果有什么高级的设计提示?

附言抱歉,如果我的问题很假,但是我在Google上搜索了该主题,但没有找到关于该主题的任何合理文章。感谢您的所有意见。

最佳答案

分割错误的主要来源是

  • 未初始化的指针(或通常未初始化的变量)
  • 对数组
  • 的出站访问
  • 编码错误的指针算法

  • 解决此问题的主要策略包括:
  • 始终初始化变量,尤其是指针
  • 避免使用裸露的指针(对于拥有数据的指针,建议使用智能指针,例如std::unique_ptrstd::shared_ptr,如果只想指向东西,则将迭代器用于标准容器中)
  • 使用标准容器(例如std::vector)代替数组和指针算法

  • 如注释中所述,编码不良的并发或并行化可能会导致分段错误(以及许多其他问题),这与未初始化的变量可以类似,因为它们可能导致变量的值意外更改。解决此问题的一般策略包括:
  • 避免共享数据–首选消息传递/队列进行线程间通信
  • 如果您拥有共享数据,并且至少有一个线程写入这些数据,请使用互斥锁,std::atomic或类似内容来保护

  • 但是,在某些情况下两者都可能意味着您失去了明显的性能优势。正确执行并行算法是认真分析和设计的问题。

    关于c++ - 如何避免SIGSEGV?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16768532/

    10-11 21:13