ABA


"memory leak בשימוש בopencv"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #11050 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 11050
matan13
חבר מתאריך 14.7.08
19469 הודעות
   18:43   05.12.12   
אל הפורום  
  memory leak בשימוש בopencv  
 
   אם אני מריץ את התכנית בלי להציג את התמונה שיצרתי, אין לי שום זליגה, אבל אם אני מציג אותם(בעזרת imshow) אני מקבל זליגת זיכרון :
definitely lost: 38,833 bytes in 1,023 blocks
==16455== indirectly lost: 54,159 bytes in 964 blocks
==16455== possibly lost: 416,455 bytes in 4,739 blocks
==16455== still reachable: 520,746 bytes in 4,543 blocks

בלי הimshow אני מקבל:
definitely lost: 0 bytes in 0 blocks
==16690== indirectly lost: 0 bytes in 0 blocks
==16690== possibly lost: 0 bytes in 0 blocks
==16690== still reachable: 10,360 bytes in 5 blocks
==16690== suppressed: 0 bytes in 0 blocks

מישהו יודע מה הבעיה? ואיך אפשר לתקן?
תודה מראש.


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  מוזר בהחלט. תראה את קטע הקוד ldan192  05.12.12 20:35 1
     הנה: matan13 05.12.12 20:57 2
         יתכנו דליפות זכרון ב-OpenCV, אבל לא מאמין שבכמות כזו. ldan192  05.12.12 21:22 3
             ''יכול להגרם גם מפונקציה קודמת שנקראת'' matan13 05.12.12 21:38 4
                 תחשוב שהקומפיילר יכול לזהות אי שינוי במידע מסויים ולא באמת לקמפל / להפעיל ldan192  05.12.12 21:56 5
  הרצתי את התכנית הבאה: matan13 06.12.12 07:35 6
     בקטע הקוד האחרון matan13 06.12.12 09:43 7
         תראה יוחאי 06.12.12 15:05 8
             כשאני מריץ את זה: matan13 06.12.12 17:30 9
                 valgrind לא מושלם ldan192  06.12.12 23:40 10

       
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:35   05.12.12   
אל הפורום  
  1. מוזר בהחלט. תראה את קטע הקוד  
בתגובה להודעה מספר 0
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
matan13
חבר מתאריך 14.7.08
19469 הודעות
   20:57   05.12.12   
אל הפורום  
  2. הנה:  
בתגובה להודעה מספר 1
 
   יצרתי מחלקה בשם ImageLoader, שיוצרת תמונות בעזרת הבנאי הבא:

ImageLoader::ImageLoader(int width, int height)
: m_image(width, height, CV_8UC3)
{
}

בmain אני יוצר תמונה:


ImageLoader img1(100,100)

ואז שולח אותה לפונקציה diplayImage שבתוך ImageLoader, שמוגדרת כך:

void ImageLoader::displayImage()
{
namedWindow("My image");
imshow("My image", m_image);
waitKey(5000);
cvDestroyWindow("My image")
}

כשאמרתי שאין לי זליגת זיכרון כשאני לא משתמש בimshow, התכוונתי שבמיין אני לא מוחק את השורה שקוראת לdisplayImage.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   21:22   05.12.12   
אל הפורום  
  3. יתכנו דליפות זכרון ב-OpenCV, אבל לא מאמין שבכמות כזו.  
בתגובה להודעה מספר 2
 
Valgrind בספריות שעוברות אופטימזציות מסויימות מזייף במיקום שהוא מתריע על הדליפה.
כלומר, זה יכול להגרם גם מפונקציה קודמת שנקראת.
וודא ש-m_image באמת מתנקה עד סיום בדיקת ההרצה.
וודא שה-ImageLoader באמת מתנקה.
אם יש לך פונקציות בדרך כמו שכפול התמונה וכו', גם לשים לב שלא דלף שם זכרון.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
matan13
חבר מתאריך 14.7.08
19469 הודעות
   21:38   05.12.12   
אל הפורום  
  4. ''יכול להגרם גם מפונקציה קודמת שנקראת''  
בתגובה להודעה מספר 3
 
   ערכתי לאחרונה בתאריך 05.12.12 בשעה 21:42 בברכה, matan13
 
גם אם כשאני לא קורא לdisplayImage אני לא מקבל שום דליפה?


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

תודה בינתיים.
ול-ImageLoader יש destructor שנראה כך:


ImageLoader::~ImageLoader()
{
m_image.release();
}

האם זה מספיק בשביל ניקוי של ImageLoader (ושל m_image) ?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   21:56   05.12.12   
אל הפורום  
  5. תחשוב שהקומפיילר יכול לזהות אי שינוי במידע מסויים ולא באמת לקמפל / להפעיל  
בתגובה להודעה מספר 4
 
את הדברים הקודמים.

אגב, נסה גם גירסא אחרת של OpenCV


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
matan13
חבר מתאריך 14.7.08
19469 הודעות
   07:35   06.12.12   
אל הפורום  
  6. הרצתי את התכנית הבאה:  
בתגובה להודעה מספר 0
 
  

#include "../include/ImageLoader.h"
#include "../include/ImageOperations.h"

int main() {
ImageLoader im1(100,100);
im1.displayImage();
return 0;
}


אני מקבל:
definitely lost: 38,833 bytes in 1,023 blocks
==3502== indirectly lost: 54,159 bytes in 964 blocks
==3502== possibly lost: 411,591 bytes in 4,720 blocks
==3502== still reachable: 514,041 bytes in 4,514 blocks
==3502== suppressed: 0 bytes in 0 blocks

ואז ניסתי ע"י imshow ישירות(חשבתי אולי הבעיה בdisplayImage):


#include "../include/ImageLoader.h"
#include "../include/ImageOperations.h"

int main() {
ImageLoader im1(100,100);
cvNamedWindow("CS", CV_WINDOW_AUTOSIZE);
imshow("CS",im1.getImage());
cvDestroyAllWindows();
return 0;
}


מקבל:
definitely lost: 38,833 bytes in 1,023 blocks
==3423== indirectly lost: 54,159 bytes in 964 blocks
==3423== possibly lost: 402,933 bytes in 4,666 blocks
==3423== still reachable: 482,716 bytes in 4,347 blocks
==3423== suppressed: 0 bytes in 0 blocks


אז חשבתי אולי הבעיה היא כללית יותר, במחלקה שלי ImageLoader ו-ImageOperations, אז ניסיתי בלעדיהם הרצתי עם הקוד הבא:


#include "cv.h"
#include "highgui.h"
int main() {
IplImage* img2=0;
img2=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
cvNamedWindow("MyWindow", CV_WINDOW_AUTOSIZE);
cvReleaseImage(&img2);
cvDestroyWindow("MyWindow");
return 0;
}

מקבל:
definitely lost: 38,833 bytes in 1,023 blocks
==3356== indirectly lost: 54,159 bytes in 964 blocks
==3356== possibly lost: 400,937 bytes in 4,657 blocks
==3356== still reachable: 484,712 bytes in 4,356 blocks
==3356== suppressed: 0 bytes in 0 blocks

מה אתם אומרים?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
matan13
חבר מתאריך 14.7.08
19469 הודעות
   09:43   06.12.12   
אל הפורום  
  7. בקטע הקוד האחרון  
בתגובה להודעה מספר 6
 
   ערכתי לאחרונה בתאריך 06.12.12 בשעה 09:59 בברכה, matan13
 
שכחתי להעתיק לפה את השורה:
cvShowImage("MyWindow", img2);

אבל היא נמצאת בקוד שלי והתוצאה של valgrind היא כמו שפירסמתי מקודם..

עזרה בבקשה???

עריכה:
אולי הבעיה היא בכלל בcvNamedWindow, הרצתי את הקוד הבא:



#include "cv.h"
#include "highgui.h"
int main() {
cvNamedWindow("MyWindow");
cvDestroyWindow("MyWindow");
return 0;
}

קיבלתי את הדליפה הבאה:
definitely lost: 38,833 bytes in 1,023 blocks
==5605== indirectly lost: 54,159 bytes in 964 blocks
==5605== possibly lost: 402,669 bytes in 4,667 blocks
==5605== still reachable: 482,992 bytes in 4,346 blocks
==5605== suppressed: 0 bytes in 0 blocks


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
יוחאי
חבר מתאריך 30.12.15
163 הודעות
   15:05   06.12.12   
אל הפורום  
  8. תראה  
בתגובה להודעה מספר 7
 
   http://tech.groups.yahoo.com/group/OpenCV/message/54863

תקרא את התגובה הראשונה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
matan13
חבר מתאריך 14.7.08
19469 הודעות
   17:30   06.12.12   
אל הפורום  
  9. כשאני מריץ את זה:  
בתגובה להודעה מספר 8
 
  


#include "cv.h"
#include "highgui.h"
using namespace std;


int main() {
for(int i=0; i<50; i++) {
cvNamedWindow("MyWindow",CV_WINDOW_AUTOSIZE);
cvWaitKey(0);
cvDestroyWindow("MyWindow");
}
}

אני מקבל אותה כמות של דליפת זיכרון כמו בלי הLOOP, זה אומר שהבעיה היא באיך valgrind בודק?
ותודה על התגובה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:40   06.12.12   
אל הפורום  
  10. valgrind לא מושלם  
בתגובה להודעה מספר 9
 


בברכה,
עידן


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

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

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



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