内存泄漏和分段错误的一般原因是什么?

时间:2009-10-22 22:40:46

标签: memory-leaks segmentation-fault

内存泄漏和分段错误的一般原因是什么?

4 个答案:

答案 0 :(得分:5)

的段错误:

  • 使用悬空指针:解除分配后不重置指针
  • 使用前未检查指针
  • 未初始化变量/成员

内存/资源泄漏:

  • 忘记释放资源(可用内存,关闭文件,......)
  • 在具有垃圾收集器的环境中:创建一个引用对象的环

如何检测/避免:

  • 悬空指针:编码规则,重新分配后严格重置指针
  • 使用静态代码检查器来避免大多数段错误
  • 使用动态代码分析器来验证资源泄漏是否消失

答案 1 :(得分:2)

内存泄漏:通常,这是指C语言,您可以手动管理内存。在这种情况下,当您完成使用它时,您将分配内存而不释放它。应用程序运行时,分配不断堆积,并且在进程完成执行之前无法释放内存。 Memory Leaks (Wikipedia)

分段错误:此类错误的最常见原因是尝试访问一部分内存,该内存不存在或位于正在运行的程序的允许内存之外(例如如果您尝试访问内存,则加载操作系统)。通常这意味着您尝试使用错误的指针,例如:

int* ptr;
...
...
...
*ptr = 5;

会导致段错误,因为ptr是一个空指针(或垃圾),并且您没有为指向指向的指针分配内存。 Segmentation Fault (Wikipedia)

答案 2 :(得分:1)

很多,包括:

  • 分配一块内存,然后使用超过已分配的内存,
  • 分配内存而不是释放它,
  • 没有正确初始化数据指针,
  • 没有正确初始化功能指针,
  • 使用错误的数字或参数值调用函数,
  • 尝试读取或写入NULL指针,
  • 错误地链接到库或不正确的库。

并非所有这些都适用于所有语言,但这些是开始思考的一些有用的东西。

答案 3 :(得分:0)

参见Addison Wesley的Effective C ++系列,非常适合手头的问题。请注意,在指针使用中,必须单独删除所有元素,然后删除指针 - 需要技巧并且通常不正确,导致隐藏的错误不容易显示。 其他海报有答案,我只是添加了一个额外的细节。