سؤال

هل هناك أي نصائح / حيل لإيجاد مراجع دورية من Shared_ptr's؟

هذا هو exmaple عما أحاول أن أجده - لسوء الحظ لا يبدو لي أن أجد الحلقة في التعليمات البرمجية الخاصة بي.

struct A
{
  boost::shared_ptr<C> anC;
};

struct B
{
  boost::shared_ptr<A> anA;
};

struct C
{
  boost::shared_ptr<B> anB;
};
هل كانت مفيدة؟

المحلول 4

لقد استخدمت مزيج من المشاركات المذكورة أعلاه. لقد استخدمت منشآت الذاكرة، وجاءت مع بعض دورات مشتبه بها وكسر تلك باستخدام Diff_PTR.

لقد استخدمت كشف تسرب الذاكرة المدمجة في CRT من قبل، ولكن لسوء الحظ في حالتي، هناك العديد من المفردات الثابتة التي لا تتعامل معها حتى تفريغ الوحدة التي أعتقد أنها بعد دورة حياة كاشفات CRT. في الأساس، يعطي الكثير من الشوخة التي هي إيجابيات خاطئة.

نصائح أخرى

أود أن أوصي باستخدام valgrind.. وبعد عند إيقاف العملية، سيظهر لك جميع الذاكرة المسربة. ما لم تقم إيقاف التشغيل الخاص بك بطريقة أو بأخرى، يجب أن يخبرك أي دورات بأنها ذاكرة تسريب وشركة Valgrind حيث تم تخصيص الذاكرة في التعليمات البرمجية.

كنت مسؤولا عن تصميم نظام مخاطر الائتمان مرة واحدة (في C ++، على الرغم من أن هذا غير مناسب). هذه الأشياء هي رسومات بيانية كبيرة حقا مع خطر تخصيصها في العقد. كان لدينا إرشادية بسيطة للعثور على ما إذا كنا في دورة - إذا اجتازنا أكثر من 500 مرة (نسيت الرقم الدقيق - كان شكلا)، وكان الجواب نعم. تعتمد معظم مخططات الكشف عن الدورة على الاستدلال مثل هذا.

لقد تلقيت مشاكل مماثلة في تسرب الذاكرة الماضية بسبب مراجع Shared_PTR دورية التي لم يتم اكتشافها لعدة أشهر.

احترس من "مخابئ". لدي كائن (دعونا نسميها "المصنع") التي تعاملت مع العناصر ("القطعة"). وكان الحاجيات ممتلكات كونه أ) ثابت، و ب) كان لديه shared_ptr<Factory> إلى خالقها (في بعض الأحيان أنشأت الحاجيات الأخرى، إلخ). كل شيء على ما يرام، حتى أضيفت ذاكرة التخزين المؤقت للقطاع للمصنع - نظرا لأن الحاجيات كانت ثابتة، فإنه من المنطقي ذاكرة التخزين المؤقت لهم، لتسليم نفس القطعة في كل مرة طلب منها. وكانت ذاكرة التخزين المؤقت بلدي مخبأ من shared_ptr<Widget>, ، لذلك تسرب الصامت الفوري. الإصلاحات واضحة، لذلك لن أذهب إليها.

في النهاية كنت قادرا على الاعتماد على النظام الأساسي الذي كنت أستخدمه للكشف عن تسرب الذاكرة هذه من CRT. لدى CRT Visual Studio للكشف عن الذاكرة واستيراب الذاكرة، والتي قمت بتمكينها في برنامج الاختبار الخاص بي لمنع الانحدار:

int main()
{
    // code code code
    // code code code

#ifdef _MSC_VER
    _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );
    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT );
    _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT );
    _CrtDumpMemoryLeaks();
#endif
}

ربما تحتوي دول مجلس التعاون الخليجي على تقارير تسرب أساسية مماثلة، لكنني لا أعرف ما هو عليه.

أعتقد أن أبسط إجابة هي أن هناك فقط يمكن أن تفعل الكثير من المؤشرات الذكية لك:

أقترح تسجيل كلما انت صنع حلقة، (سهلة إذا قمت بإنشاء كائنات ثلاثية في وقت واحد، أكثر صعوبة في ذلك ...)، ثم تحقق من هذا السجل حيث تحذف / إلغاء ربط الكائنات، أو بشكل دوري فقط إذا لم يكن ذلك ممكنا.

يمكنك تطبيق نوع من واجهة التصحيح التي ترجع قائمة من Shared_PTRS المملوكة من هذا الكائن. كنت بحاجة للقيام بذلك لكل فئة مخزنة في shared_ptr. الآن لديك رسم بياني عام يمكنك اجتيازه، ويمكنه استخدام خوارزميات الكشف عنها على ذلك. أعتقد خوارزمية المكونات المتصلة بشدة قد تعمل من أجل هذا ولكن نظرية الرسم البياني ليست بلدي forté.

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