mad boy פורסם 2012 בינואר 1 Share פורסם 2012 בינואר 1 שלום רב לכולם ושנה אזרחית מעולה!יש לי בעיה עם שחרור זכרון דינמי בשפה C.אני מקצה זכרון דינמי ע"י שימוש בפונקציית malloc בvoid main משתמש בזכרון שהוקצה למערך במס' פונקציות רקורסיביות,עם קידום המצביע כמובן.לאחר מכן כאשר אני חוזר למיין ומנסה להשתמש בפונקציית free(p) כשp זה המצביע, נרשמת לי על גבי הצג ההודעה הבאה:heap corruption detected:after normal block #60מה יכול להיות מקור הבעיה,ואיך אני יכול לפתור את זה?בתודה מראש! קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2012 בינואר 1 Share פורסם 2012 בינואר 1 קשה לומר בלי לראות את הקוד שלך. כנראה שאתה משנה את p ככה שמה שעובר ל-free הוא לא מה שהוחזר ע"י malloc, או שאתה בטעות משחרר את אותו זכרון פעמיים.תדאג לשמור את התוצאה של malloc במשתנה בצד שאתה לא משנה אותו, ואז תעביר אותו ל-free כשאתה רוצה לשחרר. קישור לתוכן שתף באתרים אחרים More sharing options...
mad boy פורסם 2012 בינואר 1 מחבר Share פורסם 2012 בינואר 1 דבר ראשון תודה על ההתעניינות,דבר שני הבעיה היא לא זו,הבעיה היא שגם אם אני לוקח מצביע נוסף ומעביר אליו את הכתובת של p זה עדיין עושה את אותה הבעיה,והסיבה שאני לא מראה את הקוד כי אני מחפש עצה ידידי,על מנת שאני אוכל למצוא את הבעיה לפתור אותה ולא לעשות זאת להבא. קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2012 בינואר 1 Share פורסם 2012 בינואר 1 כמו שאמרתי, קשה לדעת מה הבעיה המדוייקת שלך בלי לראות את הקוד.תוודא שאתה אכן משחרר בדיוק את המקום בזכרון שהקצית, כלומר שלא יקרה מצב שאתה עושה משהו כזה:int* p = malloc(...);...p++;...free(p);ותוודא שאתה לא משחרר בטעות את אותו זכרון פעמיים.ותוודא שאתה לא משחרר בטעות את הזכרון הלא נכון (לדוגמה, אתה מקצה את הזכרון בתוך פונקציה ושוכח לעדכן את הערך של המצביע).אם אתה רוצה לדעת מה קורה בדיוק, אתה יכול פשוט להוסיף הדפסות דיבאג. אחרי כל malloc ולפני כל free תדפיס את המצביע, וככה תוכל לוודא שאתה אכן לא משחרר זכרון שלא הוקצה או את אותו זכרון פעמיים. קישור לתוכן שתף באתרים אחרים More sharing options...
mad boy פורסם 2012 בינואר 1 מחבר Share פורסם 2012 בינואר 1 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); קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2012 בינואר 1 Share פורסם 2012 בינואר 1 תערוך את ההודעה ושים את הקוד בתוך טג קוד (כפתור של #), כדי שיהיה יותר קריא.על פניו הקוד שלך נראה תקין, אבל אתה עדיין צריך לוודא שהערך של p לא משתנה בשום מקום, ושאתה לא בטעות משחרר איפשהו את המצביע בתוך אחת מהפונקציות.האם ב-input או mfunc יש קריאה כלשהי ל-free או realloc?האם הערך של p אחרי ה-malloc ולפני ה-free זהה? אם לא, אז כנראה יש לך דריסת זכרון (שכנראה נובעת מ-buffer overflow) איפשהו באחת מהפונקציות. קישור לתוכן שתף באתרים אחרים More sharing options...
vitali_pe פורסם 2012 בינואר 1 Share פורסם 2012 בינואר 1 יכול להיות שכתבת מהפויינטר אחורה או קדימה, כש malloc מקצה גדלים דומים אתה לרוב מקבל כתובות קרובות, כי בתכלס זה linked list. אז אם יש לך אינדקס גבוהה מדי אתה יכול לכתוב על ההקצאה הבאה.ויותר מזה malloc שומר header עם גודל ההקצאה לפני כל כתובת שהוא מחזיר, אם אתה כותב על המידע הזה, דברים רעים יקרו ... תבדוק אינדקסים שהולכים אחורה (-1) ואם הייתי צריך לנחש, הרקורסיה שלך רצה קדימה מדי. תפעיל דיבאגר. קישור לתוכן שתף באתרים אחרים More sharing options...
mad boy פורסם 2012 בינואר 1 מחבר Share פורסם 2012 בינואר 1 הבעיה היא שאני הוספתי הדפסה של מס' התא בזכרון שלתוכו נכנס p והתא זהה לפני ואחרי הפונקציה. ומה שעוד יותר הזוי ש4 שורות מעל אני מצבע פעולה זהה לחלוטין עם משתנה אחר והשחרור מבצע הכל ביעילות ובלי בעיות. הרצתי דיבאגר והוא לא ממש עזר לי האמת קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2012 בינואר 1 Share פורסם 2012 בינואר 1 ייתכן שמה שאתה רואה הוא רק סימפטום לבעיה שמתרחשת במקום אחר (זה מה שקורה בדרך כלל כשיש דריסות זכרון... הסימפטום מופיע במקום שאינו קרוב לבעיה המקורית). קישור לתוכן שתף באתרים אחרים More sharing options...
mad boy פורסם 2012 בינואר 1 מחבר Share פורסם 2012 בינואר 1 :\ הבעיה העיקרית זה שמילא ובאמת היתה דריסה הייתי מטפל בבעיה,הבעיה האמיתי היא שיש לי 2 פונקציות רקורסיביות הקוראות האחת לשניה,ואם אני מעיף את הfree הפלט נכון והפונקציות מביאות חישוב נכון, ועם זה אין ממש איך להתמודד...לכן העלתי אתת שאלתי כאן קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2012 בינואר 1 Share פורסם 2012 בינואר 1 אז תנסה לוודא שאין לך שום דריסות זכרון בתוך הפונקציות. בכל מקום שבו אתה ניגש למערך כלשהו, תוודא ב-100% שאתה נשאר בתוך גבולות המערך. קישור לתוכן שתף באתרים אחרים More sharing options...
vitali_pe פורסם 2012 בינואר 1 Share פורסם 2012 בינואר 1 :\ הבעיה העיקרית זה שמילא ובאמת היתה דריסה הייתי מטפל בבעיה,הבעיה האמיתי היא שיש לי 2 פונקציות רקורסיביות הקוראות האחת לשניה,ואם אני מעיף את הfree הפלט נכון והפונקציות מביאות חישוב נכון, ועם זה אין ממש איך להתמודד...לכן העלתי אתת שאלתי כאןיאפ, זה הזמן ל memory debugger. האמת זה הדבר הראשון שקפץ לי לראש, פשוט היית בטוח שזאת שגיאת +1 קטנה ולא רציתי לסבך אותך + אני לא מכיר אחד לווינדוס, אני משתמש ב valgrind. יואב, אולי אתה מכיר? קישור לתוכן שתף באתרים אחרים More sharing options...
mad boy פורסם 2012 בינואר 1 מחבר Share פורסם 2012 בינואר 1 הבעיה היא שאני קורא לפונקציה עם מאלוק במיין ומשחרר במיין ועדיין יש בעיה כזוובמיין לא יכולה להתקיים זליגת זכרון קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2012 בינואר 1 Share פורסם 2012 בינואר 1 אז? דריסת זכרון יכולה להתרחש בכל מקום בתכנית ולהשפיע על כל מקום אחר. קישור לתוכן שתף באתרים אחרים More sharing options...
mad boy פורסם 2012 בינואר 1 מחבר Share פורסם 2012 בינואר 1 עקבתי ואין זליגת זכרון,איזה עוד בעיות יכולות לגרום לזה קישור לתוכן שתף באתרים אחרים More sharing options...
Recommended Posts
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.