02-04-2012, 21:35
|
|
|
חבר מתאריך: 17.03.02
הודעות: 2,354
|
|
שאלה לגבי הקצאות זיכרון ושיחרור ב-C
שלום,
כתבתי את התוכנית הבאה ב-C:
קוד PHP:
char *strsqz(char *str, char *letters) { static char *newStr; unsigned int i, newLength, writeIndex; unsigned int bucket[ASCII_LENGTH];
/* if NULL is passed as an argument, continue from last result */ if(!str) { return strsqz(newStr, letters); }
/* initialize bucket */ for(i = 0; i < ASCII_LENGTH; i++) bucket[i] = 0;
/* fill */ for(i = 0; letters[i] != '\0'; i++) bucket[(int)letters[i]]++;
/* count length of returned string */ for(i = 0, newLength = 0; i < ASCII_LENGTH; i++) if(!bucket[i]) newLength++; /* allocate memory for new string */ newStr = (char *) malloc((1 + newLength) * sizeof(char)); if(!newStr) { printf("Memory allocation error. exiting...\n"); exit (1); } /* put characters in place */ for(i = 0, writeIndex = 0; str[i] != '\0'; i++) if(!bucket[(int)str[i]]) newStr[writeIndex++] = str[i];
newStr[writeIndex] = '\0'; return newStr; }
מה שהפונקציה עושה היא ל"כווץ" מחרוזת, כלומר בהינתן מחרוזת str ומחרוזת letters, התוכנית מחזירה את המחרוזת str רק ללא התווים שיש ב-letters.
אם המשתמש קורא לפונקציה עם הפרמטר NULL, אז הפונקציה תבצע שוב את הפעולה על המחרוזת האחרונה שהוכנסה (באמצעות המשתנה הסטטי שהגדרתי).
מה שמעניין אותי במה שעשיתי הוא האם אין פה בעיה של זליגת זיכרון. כי ברגע שהמשתמש נותן לי NULL, אז אני קורא לפונקציה עם המצביע הסטטי שלי ומחזיר את התוצאה עליו.
עכשיו - מה קורה עם הזיכרון של newStr? החשש הוא שאני לא משחרר את הזיכרון (הישן) שלו כמו שצריך, ושאני דורס את המצביע לזיכרון הישן שלו עם מצביע חדש לזיכרון שהוקצה מחדש.
מצד שני, האם זאת אחריות שלי או באחריות של מי שמשתמש בפונקציה? כלומר, האם מי שמשתמש בפונקציה צריך לשחרר את הזיכרון שיש ב-newStr לפני שהוא שולח את הפונקציה מחדש או שמשהו לא טוב במה שאני עושה?
אשמח לכל עצה,
תודה.
|