ABA


"שאלה לגבי הרגלי תיכנות נכונים"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #6299 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 6299
Quant86

דרג אמינות חבר זה
   12:23   13.06.03   
אל הפורום  
  שאלה לגבי הרגלי תיכנות נכונים  
 
   זה פשוט משגע אותי, אני בונה דברים דיי מסובכים בVC, והתוכניות פשוט צוברות זכרון לאט לאט, ולא משחררות כלומר יש לפעמים MEMORY LEAKS, אני מודע לכך שכל אחד כזה זה אשמתי בתור מתכנת, אבל איך לעזאזל נלחמים עם זה?

ראיתי באינטרנט שיש תוכנות שבודקות דליפות שכאלה אבל לא ממש ראיתי גישה מעשית לגבי איך לטפל בזה, מישהו יכול לספר לי את ה"סוד" של אנשים שעושים את זה כמו שצריך? כי אני מניח שאני לא היחיד שיש לו MEMORY LEAKS ואין לו מושג מאיפה זה בא....


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  תנסה אולי לרשום הערה בכל מקום שבו אתה מקצה Gh0sT_d0g 13.06.03 12:42 1
  אתה מתכנת במקרה VC.NET ? או הרגיל? Ken 13.06.03 12:46 2
     אני מתכנת בVC הנורמלי :) בלי להשתמש בדוט נט Quant86 13.06.03 13:57 3
         קראתי ב-MSDN על ה- Garbage Collector..... Ken 13.06.03 15:43 5
             לא קשור AlexKarpman 15.06.03 20:36 13
  כמה דברים. dryice 13.06.03 15:06 4
     תודה! בדיוק מה שהתכוונתי Quant86 13.06.03 21:20 6
         אני אשרבט איזה משהוא בCPP dryice 14.06.03 16:43 7
             פשוט נפנה לאתר שנראה מאוד רלוונטי: dryice 14.06.03 17:01 8
                 10Q Quant86 14.06.03 22:48 9
     אני חייב להבהיר AlexKarpman 14.06.03 23:20 11
  ניסיון AlexKarpman 14.06.03 23:05 10
  אני דווקא נגד smart pointer adiadi 15.06.03 15:41 12
     תודה לכולם Quant86 15.06.03 21:07 14
         אחי ... שתתכנת בצבא אתה תבין מה זה סטנדרטים . eliran33 18.06.03 00:34 15

       
Gh0sT_d0g

דרג אמינות חבר זה
   12:42   13.06.03   
אל הפורום  
  1. תנסה אולי לרשום הערה בכל מקום שבו אתה מקצה  
בתגובה להודעה מספר 0
 
   זיכרון לאיזה משו, ככה שלא תשכח לשחרר אותו לאחר מכן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Ken

דרג אמינות חבר זה
   12:46   13.06.03   
אל הפורום  
  2. אתה מתכנת במקרה VC.NET ? או הרגיל?  
בתגובה להודעה מספר 0
 
   כי אם זה בVC.NET אתה לא לבד...
לא משנה כמה ניסיתי התוכניות פשוט זוללות את הזכרון!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Quant86

דרג אמינות חבר זה
   13:57   13.06.03   
אל הפורום  
  3. אני מתכנת בVC הנורמלי :) בלי להשתמש בדוט נט  
בתגובה להודעה מספר 2
 
   ד"א בVC.NET ובעצם בכל הפלטפורמה של הדוטנט, הבעיה פתירה בקלילות, כל הקטע שבMANAGED יש לך GC יעני Garbage Collector שאתה יכול להגדיר CLASS מסוג __GC או משהו כזה, וזה מנקה את הזכרון אוטומט, כמו בJAVA וכמו בכל הדוט נט...


נראה לי בסופו של דבר אני אקנה ספר ואתחיל ללמוד את זה מסודר :((((
אני פשוט לא אוהב את הדוט נט הזה, הכל יותר מדי VB :( בעעע

אובחן, יש למישהו פתרון לVC הנורמלי?

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Ken

דרג אמינות חבר זה
   15:43   13.06.03   
אל הפורום  
  5. קראתי ב-MSDN על ה- Garbage Collector.....  
בתגובה להודעה מספר 3
 
   אני כותב סרבר ב-VB.NET - ובאמת שמתי לב ש-.NET זולל המון זכרון.
הכנסתי את ה-Garbage Collector כמעט בכל פונקציה שלוקחת משאבים רציניים,
הדבר היחיד שזה עשה הוא שהוא הוריד כמה MB מהזכרון.
שמתי לב שברגע שאני מפעיל את התוכנה כמות הזכרון ההתחלתי הוא: 13 MB

מסקנה: M$ לא רציניים בעניין הזכרון.... ולא יעזור שום GC


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
AlexKarpman

דרג אמינות חבר זה
   20:36   15.06.03   
אל הפורום  
  13. לא קשור  
בתגובה להודעה מספר 5
 
   בס"ד

אתה מערבב בין שני נושאים:
1. דליפות זכרון - כאן ה-GC כן עוזר ואם אתה לא מבין את זה יש לך בעיה.
2. כמות זכרון - בלי קשר לדליפות, הדוטנט פשוט גוזל זכרון.

אם נסתכל עם VB6(לא דוטנט, רק כדוגמא):
היה שם סוג שנקרא Variant(בדוטנט הסוג Object ממלא את הפונקציונאליות שלו) - הוא גזל הרבה זכרון.
לא בגלל דליפות - אל כי כך הוא בנוי.
כנ"ל לגבי מערכים.
ב-VB6 לפחות המערכים היו OLE Arrays שלוקחים יותר זכרון ממערכים רגילים(כמו ב-C לדוגמא).


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dryice

דרג אמינות חבר זה
   15:06   13.06.03   
אל הפורום  
  4. כמה דברים.  
בתגובה להודעה מספר 0
 
   ראשית, כאשר עובדים מסודר, ובאופן מבני העסק הרבה יותר
פשוט, תדאג שכל בלוק שאתה מקצה, יש מישהוא שאחרי לשחרר אותו.
לפני שאתה כותב malloc, צריך להיות ברור לך איזה חלק בקוד
יצרך לבצע free ובאילו תנאים.
כדאי מאוד שזה יהיה מוגדר היטב, לכל שורת הקצאה תתאים
שורת free מסוימת.

לפעמים יש בעיות קשות שממש כזה לעקוב, מי משתמש באיזה
חלק מהקוד, ואז יש גימיק נחמד, בשם smart pinters,
אתה עוטף את כל הpointers שלך בכזה struct קטן שסופר כמה עותקים
יש לך לpointer הזה, ומחזיק למעשה מצביעים לstruct הזה.
את השחרור אתה מבצע כאשר אתה מוחק את המצביע האחרון לאותו
בלוק בזכרון. בC++ זה מאוד נוח, בC זה יותר מסובך

כמו כן יש מספר כלים אוטמטים שיכולים מאוד לעזור באיתור בעיות
זכרון, תחת לינוקס אני משתמש בכלי מצוין בשם valgrind
תחת חלונות יש כמה פתרונות, רובם חלשים יותר מvalgring
היחיד שמתחרה ברצינות הוא codegaurd של borland

valgrind עוקב אחרי כל ההקצאות והשחרורים שאתה עושה וכן
עוקב אחרי כל הגישות שלך לזכרון, ואם לא שחררת משהוא
הוא יגיד לך בדיוק איפה הקצת את הבלוק, עם backtrace

DRYICE


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Quant86

דרג אמינות חבר זה
   21:20   13.06.03   
אל הפורום  
  6. תודה! בדיוק מה שהתכוונתי  
בתגובה להודעה מספר 4
 
   ולא היה לי כח לחפש לבד בלי לדעת בדיוק מה....

אם אפשר, תן לי איזו דוגמא למימוש של SMART POINTERS, יותר פשוט עם דוגמאות :/


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dryice

דרג אמינות חבר זה
   16:43   14.06.03   
אל הפורום  
  7. אני אשרבט איזה משהוא בCPP  
בתגובה להודעה מספר 6
 
   עבר עריכה לאחרונה בתאריך 14.06.03 בשעה 16:50
 
בC לאחר מעט מחשבה, זה יצא ממש מכוער ולא נוח לשימוש.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dryice

דרג אמינות חבר זה
   17:01   14.06.03   
אל הפורום  
  8. פשוט נפנה לאתר שנראה מאוד רלוונטי:  
בתגובה להודעה מספר 7
 
  
http://ootips.org/yonat/4dev/smart-pointers.html
DRYICE


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Quant86

דרג אמינות חבר זה
   22:48   14.06.03   
אל הפורום  
  9. 10Q  
בתגובה להודעה מספר 8
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
AlexKarpman

דרג אמינות חבר זה
   23:20   14.06.03   
אל הפורום  
  11. אני חייב להבהיר  
בתגובה להודעה מספר 4
 
   אני חייב להבהיר שהשימוש ב-Smart Pointers ע"מ למנוע דליפות זכרון תוך שימוש ב-Refrence Counting הוא רק אחד מבין מאות(ואולי אלפי או מיליוני) שימושים אפשריים.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
AlexKarpman

דרג אמינות חבר זה
   23:05   14.06.03   
אל הפורום  
  10. ניסיון  
בתגובה להודעה מספר 0
 
   בס"ד

כמו ששאדו אמר - אחד הפתרונות הטובים ביותר הוא auto_ptr מ-STL.
כ"כ פשוט ועם זאת כ"כ רב עצמה.

פשוט כאשר יוצאים מהפונקציה - נקרא המפרק של האובייקט - ובמפרק עושים delete/free לזכרון שהוקצה בבנאי.

אבל זה לא תמיד עוזר - יש מקרים שבהם רק תכנות נכון, זהיר וערני יכול לעזור.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
adiadi

דרג אמינות חבר זה
   15:41   15.06.03   
אל הפורום  
  12. אני דווקא נגד smart pointer  
בתגובה להודעה מספר 0
 
   זה כמובן תלוי באפליקציה, ובתכנון שלה, אבל לי אישית נוח להשתמש בוקטור (או האש - תלוי בביצועים הנידרשים) ל-base class, וכל היורשים ניכנסים אליו (כמובן שבריצה רקורסיבית ניתן להחזיק את הוקטורים בתוך אובייקטי האבא). כך אני יודע מתי לשחרר מה שצריך (ואני אוהב לעשות פעולות משמעותיות בדיסטרקטור כך שאי שיחרור יגרום להתנהגות לא נכונה של האפליקציה וכך אני "מחייב" עצמי לשחרר האובייקטים). כמובן שב-C הסיפור שונה ומסובך יותר.

לגבי העובדה שאתה משתמש ב-VC : אין לי מושג בזה ולכן לא מכיר כלים מתאימים (ראיתי את ההמלצה של dryice). שמעתי על PC-LINT. אני משתמש ב-purify ו-quantify (וגם lint נותן לפעמים פלט המצביע על בעיות שכאלו, רק שגירסאות קודמות של לינט לא מזהות את השמירה של הפוינטר בוקטור ומזהירות מכך, למרות שאין צורך). בכל מיקרה הכלי ששולט אצלי בעניין זה הוא urify ואולי יש לו מקבילה בוינדוס..

בהצללללחהה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Quant86

דרג אמינות חבר זה
   21:07   15.06.03   
אל הפורום  
  14. תודה לכולם  
בתגובה להודעה מספר 12
 
   הבנתי שצריך לחשוב טוב טוב כשמקצים זכרון :(


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
eliran33

דרג אמינות חבר זה
   00:34   18.06.03   
אל הפורום  
  15. אחי ... שתתכנת בצבא אתה תבין מה זה סטנדרטים .  
בתגובה להודעה מספר 14
 
   אין מצב בעולם שאתה לא משחרר זיכרון ! פוסלים את כל התוכנית על דבר כזה !

ב D'TOR תשחרר הכל !!!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net