לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 22-08-2007, 12:53
  jasminh jasminh אינו מחובר  
 
חבר מתאריך: 14.01.05
הודעות: 176
שחרור זיכרון עם \clr

שלום,
אני משתמשת ברכיב ה- clr כדי לכתוב את הקוד הבא בפרוייקט mfc.
אני לא מבינה למה הזיכרון לא משתחרר לי אחרי ה- close.
ניסיתי להשתמש בפונקציה finalize של האובייקט אבל היא מוגדרת protected ואני לא יודעת איך להפעיל אותה.
מה אני צריכה לעשות כדי לשחרר את הזיכרון של אובייקט XmlTextReader?


תודה מראש
יסמין ה.

קוד:
long CallXmlHeaderParser(LPSTR m_pszXmlHeaderFromInputBuf) { // create Object for Reading from m_pszXmlHeaderFromInputBuf the Xml Header String ^strXmlHeader = gcnew String(m_pszXmlHeaderFromInputBuf); TextReader^ stringReader = gcnew StringReader(strXmlHeader); XmlTextReader ^ObjXmlHeaderReader = gcnew XmlTextReader(stringReader); // Return no Whitespace and no SignificantWhitespace nodes. ObjXmlHeaderReader->WhitespaceHandling = WhitespaceHandling::None; BOOL bIfThereHeaderToRead = TRUE, bIfFailedToRead = FALSE; while (TRUE) { try { bIfThereHeaderToRead = ObjXmlHeaderReader->Read(); // read XmlHeader to XmlNodes } catch (...) {bIfFailedToRead = TRUE;} // check error if (!bIfThereHeaderToRead || bIfFailedToRead) break; if (ObjXmlHeaderReader->NodeType == XmlNodeType::Element) { // ToDo } else { if (ObjXmlHeaderReader->NodeType == XmlNodeType::Text) { // ToDo } } } // finish & check result ObjXmlHeaderReader->Close(); ObjXmlHeaderReader->~XmlTextReader(); delete ObjXmlHeaderReader; //ObjXmlHeaderReader->Finalize(); if (bIfFailedToRead) return errObjXmlHeaderReaderFailedToRead; return 0; }
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #2  
ישן 14-09-2007, 19:42
  spiritus asper  
אורח
 
הודעות: n/a
בתגובה להודעה מספר 1 שנכתבה על ידי jasminh שמתחילה ב "שחרור זיכרון עם \clr"

בפשטות? את לא
אין לך שליטה על מתי ישוחרר זכרון כשאת עובדת בסביבת managed code
הכי קרוב שאפשר להגיע לכך בדוט נט הוא ע"י שימוש ב GC.Collect שיכריח את ה GC לעבור לדור הבא ואז הוא כביכול אם לשחרר משאבים שלא זקוקים להם כבר
אבל גם הפעולה הזאת לא מבטיחה ששום זכרון שהוא ישוחרר.
אם מנסים להבין איך ניהול הזכרון עובד בדוט נט, אז הדרך הפשוטה ביותר להסביר את זה, זה לומר שה CLR סופר כל הזמן כמה רפרנסים יש לכל אובייקט שנוצר על ה heap, עם ההיגיון ש"כל עוד מישהו מצביע עליו .. יתכן והוא עוד יצטרך להשתמש בו" ואז הוא לא ישחרר את הזכרון הזה (עם יוצאי דופן כמו WeakReference). זה העניין "בגדול", בפעול הנושא הרבה יותר מורכב.
כך שגם בדוט נט את יכולה להקלע למצבים של דליפות זכרון, אם את שומרת איפשהו רפרנסים לאובייקטים ואף פעם לא מסירה אותם. מה שיגרום לזכרון שהם מצביעים עליו לא להשתחרר לעולם.

אין קשר בין מטודת ה Finalize לבין שחרור זכרון. אפשר להתייחס אליה בתור "דסטרקטור" דוט נטי, ה CLR קורא לה לפני שהוא משמיד את האובייקט שהוא שייך אליו. איך את יכולה לממש אותה? הסינטקס הוא זהה לזה של ++C
משהו כזה:
קוד:
MyClass() { public MyClass() { // c-tor } ~MyClass() { // Finalize. // in compile time, the compiler will translate this method to Finalize // of course you cannoed set access modifiers to this method. } }

כנ"ל לגבי מטודת ה Dispose (נמצאת במחלקות שממשות את IDisposable).
משתמשים בה כאשר האובייקט שלך משתמש בכל מיני משאבים שנמצאים מחוץ לגבולות התוכנית שלך (מערכת קבצים, רשתות וכו'...), קריאה לפונקציה הזאת, מוודאת שכל אותם משאבים ישוחררו.
כאשר את משתמשת במחלקה שממשת את IDisposable, את צריכה לקרוא ל Dispose לפני שאת מסיימת להשתמש בה.

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

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

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

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 01:27

הדף נוצר ב 0.04 שניות עם 12 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2025 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר