为什么GCC不尝试内存泄漏检查?

时间:2011-12-09 02:20:52

标签: c memory-management gcc memory-leaks

虽然我很少再使用C,但我一直在思考我一直被告知的规则“如果你致电malloc()(或new),则必须致电free()(或{ {1}})”。它让我想知道GCC(或其他C编译器)是否尝试执行任何类型的内存并警告用户潜在的问题。我从来没有听说过,所以我怀疑情况并非如此,但我想知道。

以下是我使用的示例:

delete

使用#include <stdlib.h> int main() { int* first = malloc(sizeof(int) * 10); int* second = malloc(sizeof(int) * 10); int i = 0; for (; i < 10; i++) { first[i] = i * 2; second[i] = i * 10; } free(first); /* Forgot to free second */ return 0; } 进行编译时,未生成任何警告。虽然我可以看到为什么编译器无法提供完美的答案,因为您正在处理堆内存并在运行时管理它,为什么编译器似乎没有尝试提供可能存在内存泄漏的警告?

我对其中的一些想法包括:

  1. 编译器可能没有完美的方法来判断何时释放内存。例如,如果其中一个指针被传递到函数中并从函数中释放,编译器可能无法告诉它。
  2. 如果一个不同的线程拥有内存的所有权,那么编译器就没有办法告诉其他人可以释放内存。

2 个答案:

答案 0 :(得分:11)

通过静态分析无法检测到的情况(更不用说通过琐碎的静态分析)远远超过那些可以检测到的情况。编译器的作者可能认为将这种额外的复杂性添加到GCC的好处远远超过了成本。

答案 1 :(得分:2)

比计算freemalloc来电要复杂一些。想象一个库,其中一些库函数假定库调用malloc,但假设库的用户将调用free