בעיה עם שחרור זכרון דינמי,C - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

בעיה עם שחרור זכרון דינמי,C


mad boy

Recommended Posts

שלום רב לכולם ושנה אזרחית מעולה!

יש לי בעיה עם שחרור דינמי בשפה C.

אני מקצה דינמי ע"י שימוש בפונקציית malloc בvoid main משתמש בזכרון שהוקצה למערך במס' פונקציות רקורסיביות,עם קידום המצביע כמובן.

לאחר מכן כאשר אני חוזר למיין ומנסה להשתמש בפונקציית free(p) כשp זה המצביע, נרשמת לי על גבי הצג ההודעה הבאה:

heap corruption detected:after normal block #60

מה יכול להיות מקור הבעיה,ואיך אני יכול לפתור את זה?

בתודה מראש!

קישור לתוכן
שתף באתרים אחרים

קשה לומר בלי לראות את הקוד שלך. כנראה שאתה משנה את p ככה שמה שעובר ל-free הוא לא מה שהוחזר ע"י malloc, או שאתה בטעות משחרר את אותו פעמיים.

תדאג לשמור את התוצאה של malloc במשתנה בצד שאתה לא משנה אותו, ואז תעביר אותו ל-free כשאתה רוצה לשחרר.

קישור לתוכן
שתף באתרים אחרים

דבר ראשון תודה על ההתעניינות,דבר שני הבעיה היא לא זו,הבעיה היא שגם אם אני לוקח מצביע נוסף ומעביר אליו את הכתובת של p זה עדיין עושה את אותה הבעיה,והסיבה שאני לא מראה את הקוד כי אני מחפש עצה ידידי,על מנת שאני אוכל למצוא את הבעיה לפתור אותה ולא לעשות זאת להבא.

קישור לתוכן
שתף באתרים אחרים

כמו שאמרתי, קשה לדעת מה הבעיה המדוייקת שלך בלי לראות את הקוד.

תוודא שאתה אכן משחרר בדיוק את המקום בזכרון שהקצית, כלומר שלא יקרה מצב שאתה עושה משהו כזה:

int* p = malloc(...);
...
p++;
...
free(p);

ותוודא שאתה לא משחרר בטעות את אותו פעמיים.

ותוודא שאתה לא משחרר בטעות את הזכרון הלא נכון (לדוגמה, אתה מקצה את הזכרון בתוך פונקציה ושוכח לעדכן את הערך של המצביע).

אם אתה רוצה לדעת מה קורה בדיוק, אתה יכול פשוט להוסיף הדפסות דיבאג. אחרי כל malloc ולפני כל free תדפיס את המצביע, וככה תוכל לוודא שאתה אכן לא משחרר שלא הוקצה או את אותו פעמיים.

קישור לתוכן
שתף באתרים אחרים

תערוך את ההודעה ושים את הקוד בתוך טג קוד (כפתור של #), כדי שיהיה יותר קריא.

על פניו הקוד שלך נראה תקין, אבל אתה עדיין צריך לוודא שהערך של p לא משתנה בשום מקום, ושאתה לא בטעות משחרר איפשהו את המצביע בתוך אחת מהפונקציות.

האם ב-input או mfunc יש קריאה כלשהי ל-free או realloc?

האם הערך של p אחרי ה-malloc ולפני ה-free זהה? אם לא, אז כנראה יש לך דריסת (שכנראה נובעת מ-buffer overflow) איפשהו באחת מהפונקציות.

קישור לתוכן
שתף באתרים אחרים

יכול להיות שכתבת מהפויינטר אחורה או קדימה, כש malloc מקצה גדלים דומים אתה לרוב מקבל כתובות

קרובות, כי בתכלס זה linked list. אז אם יש לך אינדקס גבוהה מדי אתה יכול לכתוב על ההקצאה הבאה.

ויותר מזה malloc שומר header עם גודל ההקצאה לפני כל כתובת שהוא מחזיר, אם אתה כותב על

המידע הזה, דברים רעים יקרו ...

תבדוק אינדקסים שהולכים אחורה (-1) ואם הייתי צריך לנחש, הרקורסיה שלך רצה קדימה מדי. תפעיל דיבאגר.

קישור לתוכן
שתף באתרים אחרים

הבעיה היא שאני הוספתי הדפסה של מס' התא בזכרון שלתוכו נכנס p והתא זהה לפני ואחרי הפונקציה.

ומה שעוד יותר הזוי ש4 שורות מעל אני מצבע פעולה זהה לחלוטין עם משתנה אחר והשחרור הכל ביעילות ובלי בעיות.

הרצתי דיבאגר והוא לא ממש עזר לי האמת :(

קישור לתוכן
שתף באתרים אחרים

:\ הבעיה העיקרית זה שמילא ובאמת היתה דריסה הייתי מטפל בבעיה,הבעיה האמיתי היא שיש לי 2 פונקציות רקורסיביות הקוראות האחת לשניה,ואם אני מעיף את הfree הפלט נכון והפונקציות מביאות חישוב נכון, ועם זה אין ממש איך להתמודד...

לכן העלתי אתת שאלתי כאן

קישור לתוכן
שתף באתרים אחרים

:\ הבעיה העיקרית זה שמילא ובאמת היתה דריסה הייתי מטפל בבעיה,הבעיה האמיתי היא שיש לי 2 פונקציות רקורסיביות הקוראות האחת לשניה,ואם אני מעיף את הfree הפלט נכון והפונקציות מביאות חישוב נכון, ועם זה אין ממש איך להתמודד...

לכן העלתי אתת שאלתי כאן

יאפ, זה הזמן ל memory debugger. האמת זה הדבר הראשון שקפץ לי לראש, פשוט היית בטוח שזאת שגיאת +1

קטנה ולא רציתי לסבך אותך + אני לא מכיר אחד לווינדוס, אני משתמש ב valgrind.

יואב, אולי אתה מכיר?

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...