עבור לתוכן
View in the app

A better way to browse. Learn more.

HWzone

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Featured Replies

פורסם

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

יש לי בעיה עם שחרור זכרון דינמי בשפה 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 תדפיס את המצביע, וככה תוכל לוודא שאתה אכן לא משחרר זכרון שלא הוקצה או את אותו זכרון פעמיים.

פורסם
  • מחבר




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);

פורסם

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

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

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

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

פורסם

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

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

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

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

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

פורסם
  • מחבר

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

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

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

פורסם

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

פורסם
  • מחבר

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

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

פורסם

אז תנסה לוודא שאין לך שום דריסות זכרון בתוך הפונקציות. בכל מקום שבו אתה ניגש למערך כלשהו, תוודא ב-100% שאתה נשאר בתוך גבולות המערך.

פורסם

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

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

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

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

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

פורסם
  • מחבר

הבעיה היא שאני קורא לפונקציה עם מאלוק במיין ומשחרר במיין ועדיין יש בעיה כזו

ובמיין לא יכולה להתקיים זליגת זכרון

פורסם

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

פורסם
  • מחבר

עקבתי ואין זליגת זכרון,איזה עוד בעיות יכולות לגרום לזה

ארכיון

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

דיונים חדשים

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.