פורסם 2012 בינואר 113 שנים שלום רב לכולם ושנה אזרחית מעולה!יש לי בעיה עם שחרור זכרון דינמי בשפה C.אני מקצה זכרון דינמי ע"י שימוש בפונקציית malloc בvoid main משתמש בזכרון שהוקצה למערך במס' פונקציות רקורסיביות,עם קידום המצביע כמובן.לאחר מכן כאשר אני חוזר למיין ומנסה להשתמש בפונקציית free(p) כשp זה המצביע, נרשמת לי על גבי הצג ההודעה הבאה:heap corruption detected:after normal block #60מה יכול להיות מקור הבעיה,ואיך אני יכול לפתור את זה?בתודה מראש!
פורסם 2012 בינואר 113 שנים קשה לומר בלי לראות את הקוד שלך. כנראה שאתה משנה את p ככה שמה שעובר ל-free הוא לא מה שהוחזר ע"י malloc, או שאתה בטעות משחרר את אותו זכרון פעמיים.תדאג לשמור את התוצאה של malloc במשתנה בצד שאתה לא משנה אותו, ואז תעביר אותו ל-free כשאתה רוצה לשחרר.
פורסם 2012 בינואר 113 שנים מחבר דבר ראשון תודה על ההתעניינות,דבר שני הבעיה היא לא זו,הבעיה היא שגם אם אני לוקח מצביע נוסף ומעביר אליו את הכתובת של p זה עדיין עושה את אותה הבעיה,והסיבה שאני לא מראה את הקוד כי אני מחפש עצה ידידי,על מנת שאני אוכל למצוא את הבעיה לפתור אותה ולא לעשות זאת להבא.
פורסם 2012 בינואר 113 שנים כמו שאמרתי, קשה לדעת מה הבעיה המדוייקת שלך בלי לראות את הקוד.תוודא שאתה אכן משחרר בדיוק את המקום בזכרון שהקצית, כלומר שלא יקרה מצב שאתה עושה משהו כזה:int* p = malloc(...);...p++;...free(p);ותוודא שאתה לא משחרר בטעות את אותו זכרון פעמיים.ותוודא שאתה לא משחרר בטעות את הזכרון הלא נכון (לדוגמה, אתה מקצה את הזכרון בתוך פונקציה ושוכח לעדכן את הערך של המצביע).אם אתה רוצה לדעת מה קורה בדיוק, אתה יכול פשוט להוסיף הדפסות דיבאג. אחרי כל malloc ולפני כל free תדפיס את המצביע, וככה תוכל לוודא שאתה אכן לא משחרר זכרון שלא הוקצה או את אותו זכרון פעמיים.
פורסם 2012 בינואר 113 שנים מחבר printf("enter the array size \n"); scanf("%d",&size); p=(int*)malloc((size+1) * sizeof(int)); if (p==NULL) exit(1); input(p,size,0,0); mfunc(p,size); free(p);
פורסם 2012 בינואר 113 שנים תערוך את ההודעה ושים את הקוד בתוך טג קוד (כפתור של #), כדי שיהיה יותר קריא.על פניו הקוד שלך נראה תקין, אבל אתה עדיין צריך לוודא שהערך של p לא משתנה בשום מקום, ושאתה לא בטעות משחרר איפשהו את המצביע בתוך אחת מהפונקציות.האם ב-input או mfunc יש קריאה כלשהי ל-free או realloc?האם הערך של p אחרי ה-malloc ולפני ה-free זהה? אם לא, אז כנראה יש לך דריסת זכרון (שכנראה נובעת מ-buffer overflow) איפשהו באחת מהפונקציות.
פורסם 2012 בינואר 113 שנים יכול להיות שכתבת מהפויינטר אחורה או קדימה, כש malloc מקצה גדלים דומים אתה לרוב מקבל כתובות קרובות, כי בתכלס זה linked list. אז אם יש לך אינדקס גבוהה מדי אתה יכול לכתוב על ההקצאה הבאה.ויותר מזה malloc שומר header עם גודל ההקצאה לפני כל כתובת שהוא מחזיר, אם אתה כותב על המידע הזה, דברים רעים יקרו ... תבדוק אינדקסים שהולכים אחורה (-1) ואם הייתי צריך לנחש, הרקורסיה שלך רצה קדימה מדי. תפעיל דיבאגר.
פורסם 2012 בינואר 113 שנים מחבר הבעיה היא שאני הוספתי הדפסה של מס' התא בזכרון שלתוכו נכנס p והתא זהה לפני ואחרי הפונקציה. ומה שעוד יותר הזוי ש4 שורות מעל אני מצבע פעולה זהה לחלוטין עם משתנה אחר והשחרור מבצע הכל ביעילות ובלי בעיות. הרצתי דיבאגר והוא לא ממש עזר לי האמת
פורסם 2012 בינואר 113 שנים ייתכן שמה שאתה רואה הוא רק סימפטום לבעיה שמתרחשת במקום אחר (זה מה שקורה בדרך כלל כשיש דריסות זכרון... הסימפטום מופיע במקום שאינו קרוב לבעיה המקורית).
פורסם 2012 בינואר 113 שנים מחבר :\ הבעיה העיקרית זה שמילא ובאמת היתה דריסה הייתי מטפל בבעיה,הבעיה האמיתי היא שיש לי 2 פונקציות רקורסיביות הקוראות האחת לשניה,ואם אני מעיף את הfree הפלט נכון והפונקציות מביאות חישוב נכון, ועם זה אין ממש איך להתמודד...לכן העלתי אתת שאלתי כאן
פורסם 2012 בינואר 113 שנים אז תנסה לוודא שאין לך שום דריסות זכרון בתוך הפונקציות. בכל מקום שבו אתה ניגש למערך כלשהו, תוודא ב-100% שאתה נשאר בתוך גבולות המערך.
פורסם 2012 בינואר 113 שנים :\ הבעיה העיקרית זה שמילא ובאמת היתה דריסה הייתי מטפל בבעיה,הבעיה האמיתי היא שיש לי 2 פונקציות רקורסיביות הקוראות האחת לשניה,ואם אני מעיף את הfree הפלט נכון והפונקציות מביאות חישוב נכון, ועם זה אין ממש איך להתמודד...לכן העלתי אתת שאלתי כאןיאפ, זה הזמן ל memory debugger. האמת זה הדבר הראשון שקפץ לי לראש, פשוט היית בטוח שזאת שגיאת +1 קטנה ולא רציתי לסבך אותך + אני לא מכיר אחד לווינדוס, אני משתמש ב valgrind. יואב, אולי אתה מכיר?
פורסם 2012 בינואר 113 שנים מחבר הבעיה היא שאני קורא לפונקציה עם מאלוק במיין ומשחרר במיין ועדיין יש בעיה כזוובמיין לא יכולה להתקיים זליגת זכרון
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.