只是为了好玩(和C编程实践),我写了下面这段代码执行以下操作:C中的内存分配跟踪 - 我做对了吗?
- 充当内存分配跟踪系统
- 释放所有动态与函数调用分配的内存
下面是代码:
typedef enum _OpMode {
OM_APPEND,
OM_DESTROY
} OP_MODE;
void refOp(void *ptr, OP_MODE mode) {
/* contains static array of pointers and provides an interface to that
array */
static void **references = NULL;
static int size = 0;
static int reset = 0;
if (reset) {
reset = 0;
references = NULL;
size = 0;
}
switch (mode) {
case OM_APPEND:
//add a pointer to reference array
references = (void**) realloc(references, sizeof(void*) * (size + 1));
references[size++] = ptr;
break;
case OM_DESTROY:
//free memory at all pointers kept in reference array
for (int i = 0; i < size; i++) {
free(references[i]);
references[i] = NULL;
}
free(references);
reset = 1;
break;
default:
printf("Invalid enum value '%d' passed as mode.\n", mode);
break;
}
}
void refDestroyAll() {
//Wrapper function
refOp(NULL, OM_DESTROY);
}
void *myAlloc(void* ptr, size_t size) {
/* Allocates memory and stores pointer copy in reference array */
void *tmp_ptr;
tmp_ptr = realloc(ptr, size);
refOp(tmp_ptr, OM_APPEND);
return tmp_ptr;
}
的想法是,一个会用myAlloc()
而不是malloc
或realloc
来动态分配内存。然后使用refDestroyAll()
释放所有使用myAlloc()
创建的内存。
我已经做了一些测试,它似乎工作,但我不禁觉得我失去了一些重要的东西。这段代码实际上是否按照预期工作,或者我打电话给refDestroyAll()
时是否在泄漏内存?
也许你可以追踪一些性能分析工具的源代码,比如valgrind http://valgrind.org/。 – qrtt1 2012-07-30 02:40:20
对于你正在做的事情,只要在你的代码上运行valgrind本身就会让你知道你是否从'refDestroyAll()泄漏了内存......你不需要检查valgrind的源代码。 – Jason 2012-07-30 02:50:08
@ qrtt1:感谢valgrind链接。我现在只是测试我的程序。 – 2012-07-30 03:18:18