虽然我很少再使用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;
}
进行编译时,未生成任何警告。虽然我可以看到为什么编译器无法提供完美的答案,因为您正在处理堆内存并在运行时管理它,为什么编译器似乎没有尝试提供可能存在内存泄漏的警告?
我对其中的一些想法包括:
答案 0 :(得分:11)
通过静态分析无法检测到的情况(更不用说通过琐碎的静态分析)远远超过那些可以检测到的情况。编译器的作者可能认为将这种额外的复杂性添加到GCC的好处远远超过了成本。
答案 1 :(得分:2)
比计算free
和malloc
来电要复杂一些。想象一个库,其中一些库函数假定库调用malloc
,但假设库的用户将调用free
。