只是爲了好玩(和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