سؤال

لقد كتبت برنامجا بسيطا للغاية C ++ لقراءة 600 إطارات فيديو في رمز متعدد الخيوط. المشكلة هي أنه عندما أصدر كل من هذه الإطارات لا يتغير حجم الذاكرة الحرة! أنا أستخدم QT 4.8 و Ubuntu 12.04 حجم ذاكرة الكمبيوتر المحمول الخاص بي هو 8 جيجابايت لذلك ليس لدي أي نقص في الذاكرة.

كل إطار هو 1.8 ميغابايت، وبالتالي فإن الحجم الإجمالي هو 600 * 1.8 ميغابايت= 1080 ميغابايت

قبل تشغيل البرنامج هو حجم Free Memory الخاص بي هو 6.8 جيجابايت ولكن بعد تشغيل التعليمات البرمجية الخاصة بي والسماح له بالانتهاء، أرى أن حجم الذاكرة المجانية هو 5.9 جيجابايت لذلك أرى أن هناك تسربا كبيرا في الذاكرة في البرنامج. لقد قمت بتشغيل الرمز الخاص بي 1000 مرة ولا شهدت تعطل برنامجي أو مواجهة أي مشاكل حتى يكون الرمز بخير.

الرمز الخاص بي:

giveacodicetagpre.

im_loader.h

giveacodicetagpre.

mainwindow.cpp

giveacodicetagpre.

mainwindow.h

giveacodicetagpre.

تعريفات .h

giveacodicetagpre.

لقد قرأت في بعض المقالات التي تدعم نسخة opencv c ++ إدارة الذاكرة حتى لا يتعين علينا أن نكون قلقين بشأن تسرب الذاكرة.

هل أنا أفتقد شيئا هنا؟ لقد قرأت هذه الأسئلة أيضا ولكن لا شيء منهم يعمل بالنسبة لي هذا و هذا

منشور واحد فقط مسمالي هو كذلك وأعتقدني أن أفكر إذا كان لدي هذه المشكلة في التعليمات البرمجية لكنني لم أستطع معرفة ذلك. هذا هو الرابط

سأقدم أي شيء آخر إذا لزم الأمر.

تم التعديل:

من المثير للاهتمام للغاية أنه إذا أضفت وظيفة تأخير في فئة ImageLoader الخاصة بي مباشرة بعد قراءة كل إطار، فإن كمية تسرب الذاكرة تقلل !!!

My New Im_loader.cpp

giveacodicetagpre.

إضافة مؤشر 100 مللي ثانية خفض تسرب الذاكرة إلى 100 ميجا بايت فقط بدلا من 1 غيغابايت !!!

هل كانت مفيدة؟

المحلول

أخيرا، اكتشفت ما الذي تسبب في تسرب الذاكرة هذه ... كما ترى في فئة IM_LADER وتشغيلها على وجه التحديد () لدي هذه الكتلة من التعليمات البرمجية:

giveacodicetagpre.

منذ استخدام OpenCV إجراء عد مرجعي ل CV :: MAT كائن، يتم نسخ صورة الإدخال إلى متغير Dataa ثم في PD_Classifier.يحصل حذف PD_Classifier ولكن Dataa No!لذلك عندما أزلت هذا الخط وتغيير الرمز إلى هذه المشكلة حصلت على حلها:

giveacodicetagpre.

اعتقدت أنه نظرا لأن Dataa هو متغير محلي سيتم حذفه بعد الخروج من الدالة Run () ولكن يبدو أنه على الرغم من أنه يتم حذفه بعد الخروج من دالة بياناتها التي تبقى على الذاكرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top