我正在使用一个1000字节的静态数组实现我自己的免费问题。可能发生的两个问题是它们是否传入了一个不是指针(char a; free((&a));)
的参数,因为free接受一个void指针(free(void*p))
。
此外,当用户没有使用malloc char * a; free(a);
时。您如何建议我检查这些边缘情况。我知道指针除了它们指向的内容之外没有任何其他信息,所以我很难理解如何区分某个int是指向的int还是只是一个常规的int。
答案 0 :(得分:2)
这样做的方法是:
在您的分配例程中,请记住您提供的地址。
在您的免费例程中,检查被释放的地址。如果不是您发出的,请报告错误。如果是,请将其从未完成的地址列表中删除。
较轻的解决方案只是检查传递给您的免费例程的每个地址,看它是否在您的阵列中。这将捕获释放数组之外的东西的尝试,但它不会捕获释放先前释放的地址的调用或仍在数组中的稍微修改过的地址。
请注意,将任意指针与<
或>
进行比较实际上并不是由C定义的。(只有在已经知道它们指向同一数组的情况下才会定义它。但是,常见的C实现允许这个,并且可以容忍学习练习。)