【发布时间】:2012-05-07 01:05:10
【问题描述】:
无论我做什么,我都不知道为什么会泄漏内存。我正在释放所有动态创建的内存,但它说我有 406 个泄漏。任何提示都会很棒。我花了一周的时间试图弄清楚并使用crtdbg(不显示任何线条)和VLD,但仍然没有运气。抱歉,代码太长了:
---------- Block 742 at 0x00F06D50: 56 bytes ----------
Call Stack:
c:\users\main\desktop\lab3123.c (113): lab3.exe!createNode + 0xA bytes
c:\users\main\desktop\lab3123.c (152): lab3.exe!addToArr + 0x9 bytes
c:\users\main\desktop\lab3123.c (66): lab3.exe!main + 0x10 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (555): lab3.exe!__tmainCRTStartup + 0x19 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (371): lab3.exe!mainCRTStartup
0x76713677 (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes
0x775B9F42 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x63 bytes
0x775B9F15 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x36 bytes
Data:
74 65 63 68 6E 6F 6C 6F 67 79 00 CD CD CD CD CD technolo gy......
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........
CD CD CD CD 01 00 00 00 ........ ........
---------- Block 746 at 0x00F06E20: 56 bytes ----------
Call Stack:
c:\users\main\desktop\lab3123.c (113): lab3.exe!createNode + 0xA bytes
c:\users\main\desktop\lab3123.c (152): lab3.exe!addToArr + 0x9 bytes
c:\users\main\desktop\lab3123.c (66): lab3.exe!main + 0x10 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (555): lab3.exe!__tmainCRTStartup + 0x19 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (371): lab3.exe!mainCRTStartup
0x76713677 (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes
0x775B9F42 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x63 bytes
0x775B9F15 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x36 bytes
Data:
68 75 6D 61 6E 69 74 79 00 CD CD CD CD CD CD CD humanity ........
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........
CD CD CD CD 01 00 00 00 ........ ........
Visual Leak Detector detected 406 memory leaks (26480 bytes).
Largest number used: 43684 bytes.
Total allocations: 57944 bytes.
Visual Leak Detector is now exiting.
Press any key to continue . . .
WORDNEW* createNode(char *str)
{
WORDNEW* w;
if(!(w = (WORDNEW*)malloc(sizeof(WORDNEW))))
printf("Memory Allocation Error"),
exit(100);
strcpy(w->str, str);
w->count = 1;
return w;
}
//addToArr: adds a word to the hash array or linked list if there is a collision
void addToArr( char *str, HASH_ARR_ELEM hashArr[]){
int homeAddress = 0;
int addResult = 0;
int probe = 0;
HASH_ARR_ELEM *ph;
WORDNEW *w;
WORDNEW *rWord;
rWord = NULL;
homeAddress = hashFunct(str);
ph = &hashArr[homeAddress];
if(ph->wordPtr == NULL){
if(!(ph->wordPtr = (WORDNEW*)malloc(sizeof(WORDNEW))))
printf("Memory Allocation Error"),
exit(100);
strcpy(ph->wordPtr->str, str);
ph->wordPtr->count = 1;
}else if(ph->wordPtr != NULL && ph->headPtr == NULL){
if(!(strcmp(ph->wordPtr->str, str)))
ph->wordPtr->count++;
else {
ph->headPtr = createList(cmpWord);
w = createNode(str);
addNode(ph->headPtr,w,&probe);
}
}else {
w = createNode(str);
if(!(strcmp(ph->wordPtr->str, str))){
ph->wordPtr->count++;
free(w);
}else if(retrieveNode(ph->headPtr,w,&rWord,&probe) == 1){
rWord->count++;
free(w);
}else
addNode(ph->headPtr,w,&probe);
} //end else
} // end addToArr
【问题讨论】:
-
听到提示。让你的程序足够小,这样你就没有内存泄漏,如果需要的话,一直到一个空的主程序。然后逐渐添加回你认为不应该泄漏的东西。观察导致泄漏的原因。
-
是否 (WORDNEW*)malloc(sizeof(WORDNEW)) 曾经被释放?
-
另一个提示是发布更少的代码。我不知道有多少人从 SO 问题中编译每段代码,但我尝试对其进行审查。更短的代码更容易和更快地审查。
-
Alex 很抱歉,但我想我会帮忙的。
-
That's really a lot of code to wade through. 作为一般调试技巧,我会建议与@DougT 相同的事情。做到了:使您的程序足够小,以使其没有泄漏。或者,您可以使用 Valgrind 之类的内存分析器。
标签: c memory-leaks linked-list frequency