قائمة مرجعية لكتابة منشئ النسخ ومشغل المهمة في C++

StackOverflow https://stackoverflow.com/questions/214891

سؤال

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

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

المحلول

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

في بعض الأحيان، فأنت لا تزال تحتاج إلى توفير الازدواجية على فئة من التسلسل الهرمي متعدد الأشكال، في هذه الحالة: تعطيل عامل التعيين، وكتابة (المحمية؟) نسخة منشئ، وتوفير وظيفة استنساخ الظاهري ()

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

وأنا أنصح أيضا لإلقاء نظرة على C ++ التعليمات بشأن عوامل التعيين ، وفي نسخة ومبادلة لغة و في GOTW .

نصائح أخرى

تعمل الإصدارات التي أنشأها المترجم في معظم المواقف.

تحتاج إلى التفكير بشكل أكثر جدية في المشكلة عندما يحتوي كائنك على مؤشر RAW (حجة لعدم وجود مؤشرات RAW).إذن لديك مؤشر RAW، والسؤال الثاني هو هل تمتلك المؤشر (هل يتم حذفه بواسطتك)؟إذا كان الأمر كذلك، فسوف تحتاج إلى تطبيق القاعدة الرابعة.

أصبح امتلاك أكثر من مؤشر RAW واحدًا أمرًا صعبًا بشكل متزايد (الزيادة في التعقيد ليست خطية أيضًا [ولكن هذا أمر رصدي وليس لدي إحصائيات حقيقية لدعم هذا البيان]).لذا، إذا كان لديك أكثر من مؤشر RAW واحد، ففكر في تغليف كل مؤشر في فئته الخاصة (شكل من أشكال المؤشر الذكي).

القاعدة 4:إذا كان الكائن هو مالك مؤشر RAW، فأنت بحاجة إلى تحديد الأعضاء الأربعة التاليين للتأكد من أنك تتعامل مع إدارة الذاكرة بشكل صحيح:

  • البناء
  • نسخ المنشئ
  • مهمة تشغيل
  • المدمر

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

  • البناء الافتراضي:اضبط المؤشر على NULL
  • منشئ النسخ:استخدم فكرة النسخ والمبادلة لتوفير "ضمان الاستثناء القوي"
  • مهمة تشغيل:التحقق من التعيين إلى الذات
  • المدمرة:الحذر من الاستثناءات التي تنتشر خارج المدمر.

ومحاولة لقراءة هذا.

http://www.icu-project.org/docs /papers/cpp_report/the_anatomy_of_the_assignment_operator.html

وهو تحليل جيد للغاية من عامل التعيين

وليس لدي أي فكرة عن استثناء بأمان هنا لكنني السير في هذا الطريق. دعونا نتصور انها المجمع مجموعة قالب. نأمل أن يساعد:)

Array(const Array& rhs)
    {
        mData = NULL;
        mSize = rhs.size();
        *this = rhs;
    }

    Array& operator=(const Array& rhs)
    {
        if(this == &rhs)
        {
            return *this;
        }

        int len = rhs.size();

        delete[] mData;

        mData = new T[len];

        for(int i = 0; i < len; ++i)
        {
            mData[i] = rhs[i];
        }

        mSize = len;

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