有没有办法告诉指针的内存分配已经解除分配?我刚刚开始使用C语言,我认为我终于开始理解C中内存管理的复杂性。
例如:
char* pointer;
pointer = malloc(1024);
/* do stuff */
free(pointer);
/* test memory allocation after this point */
我知道指针仍会存储内存地址,直到我设置pointer = NULL
- 但有没有办法测试指针不再引用我可以使用的内存,而不必先将其设置为NULL?
我想要这样做的原因是我对我的C程序进行了一系列单元测试,其中一个确保在我调用一个特殊函数后没有孤立指针,该函数执行一对链接的清理名单。看一下调试器,我可以看到我的清理函数正在运行,但是我想要一种测试指针的方法,这样我就可以将它们包装在一个单元测试断言中。
答案 0 :(得分:5)
没有标准化的内存管理可以告诉您任何给定的地址是否是当前分配的内存块的一部分。
出于单元测试的目的,您可以创建一个跟踪每个分配的全局映射,因此您可以通过自定义malloc
函数进行每个分配,该函数在调试版本中向地图添加条目,在free
中再次删除它。
答案 1 :(得分:2)
为了进行单元测试,您始终可以链接到已检测的库版本(例如electric fence)。
不理想,因为您在生产和测试环境中引入了差异。
有些系统可能会在其标准库版本中提供足够的工具。例如,Mac OS 10.5库支持在双重释放时调用abort (3)
,因此如果您的单元测试器可以捕获信号,那么您就可以在家中免费使用。
无耻且毫无意义的自我推销:我的little toy c unit testing framework 可以陷阱信号。
答案 2 :(得分:1)
标准C和POSIX(我认为)都没有提供检查方法。您的特定操作系统可能会具有某种精心设计的黑魔法,但这只会向系统程序员的内部循环显示。
答案 3 :(得分:-2)
使用好的c练习。例如:
char* pointer = NULL;
/* do stuff */
pointer = malloc(1024);/* malloc does not always work, check it. */
if(pointer == NULL) {
/*Help me, warn or exit*/
}
/* do stuff */
if(pointer) {
free(pointer);
pointer = NULL;
}
/* do stuff */
if(pointer) {
/* tested memory allocation stuff */
}
更长,是的,但是如果你总是将一个释放的指针设置为NULL,那么很容易测试。