shared_ptr فئة

التفاف مؤشر ذكية المحسوبة على مرجع حول كائن مخصصة بشكل حيوي.

template<class Ty>
   class shared_ptr {
public:
    typedef Ty element_type;

    shared_ptr();
    shared_ptr(nullptr_t); 
    shared_ptr(const shared_ptr& sp);
    shared_ptr(shared_ptr&& sp);
    template<class Other>
        explicit shared_ptr(Other * ptr);
    template<class Other, class D>
        shared_ptr(Other * ptr, D dtor);
    template<class D>
        shared_ptr(nullptr_t, D dtor);
    template<class Other, class D, class A>
        shared_ptr(Other *ptr, D dtor, A alloc);
    template<class D, class A>
        shared_ptr(nullptr_t, D dtor, A alloc);
    template<class Other>
        shared_ptr(const shared_ptr<Other>& sp);
    template<class Other>
        shared_ptr(const shared_ptr<Other>&& sp);
    template<class Other>
        explicit shared_ptr(const weak_ptr<Other>& wp);
    template<class Other>
        shared_ptr(auto_ptr<Other>& ap);
    template<class Other, class D>
        shared_ptr(unique_ptr<Other, D>&& up);
    template<class Other>
        shared_ptr(const shared_ptr<Other>& sp, Ty *ptr);

    ~shared_ptr();

    shared_ptr& operator=(const shared_ptr& sp);
    template<class Other> 
        shared_ptr& operator=(const shared_ptr<Other>& sp);
    shared_ptr& operator=(shared_ptr&& sp);
    template<class Other> 
        shared_ptr& operator=(shared_ptr<Other>&& sp);
    template<class Other> 
        shared_ptr& operator=(auto_ptr< Other >&& ap);
    template <class Other, class D> 
        shared_ptr& operator=(const unique_ptr< Other, D>& up) = delete;
    template <class Other, class D> 
    void swap(shared_ptr& sp);
    void reset();
    template<class Other>
        void reset(Other *ptr);
    template<class Other, class D>
        void reset(Other *ptr, D dtor);
    template<class Other, class D, class A>
        void reset(Other *ptr, D dtor, A alloc);

    Ty *get() const;
    Ty& operator*() const;
    Ty *operator->() const;
    long use_count() const;
    bool unique() const;
    operator bool() const;

    template<class Other>
        bool owner_before(shared_ptr<Other> const& ptr) const;
    template<class Other>
        bool owner_before(weak_ptr<Other> const& ptr) const;
    template<class D, class Ty> 
        D* get_deleter(shared_ptr<Ty> const& ptr);
};

المعلمات

  • Ty
    نوع التحكم بواسطة المؤشر المشترك.

  • Other
    نوع التحكم بواسطة المؤشر وسيطة.

  • ptr
    مؤشر إلى نسخة.

  • D
    نوع deleter.

  • A
    نوع المخصص.

  • dtor
    deleter.

  • alloc
    المخصص.

  • sp
    مؤشر ذكى لنسخ أو تحريك.

  • wp
    مؤشر ضعيف لنسخ أو تحريك.

  • ap
    التلقائي مؤشر إلى نسخة أو نقله.

  • up
    فريدة مؤشر إلى تحريك.

ملاحظات

فئة القالب يصف كائن يستخدم مرجع عد إلى إدارة موارد. shared_ptrيحتوي على كائن فاعلية مؤشر إلى المورد الذي يملك أو يحمل المؤشر الفارغ. مورد يمكن أن يملكها المزيد shared_ptrالكائن؛ عند آخر shared_ptrالكائن الذي يملك موردا معيناً هو إتلاف المورد هو تحريرها.

shared_ptrيتوقف المالكة مورد عند ذلك هو يعيد تعيين المعاملة أو يعيد تعيين المعاملة.

وسيطة قالب Tyقد تكون على نوع غير كامل باستثناء كما هو موضح في لبعض عضو الوظائف.

عند shared_ptr<Ty>كائن هو بناء من مؤشر مورد من النوع G*أو من shared_ptr<G>ونوع مؤشر G*يجب أن تكون convertible إلى Ty*. إذا كان ذلك هو لا، سوف لا ترجمة تعليمات برمجية. فعلى سبيل المثال:

class F {};
class G : public F {};

shared_ptr<G> sp0(new G);   // okay, template parameter G and argument G*
shared_ptr<G> sp1(sp0);     // okay, template parameter G and argument shared_ptr<G>
shared_ptr<F> sp2(new G);   // okay, G* convertible to F*
shared_ptr<F> sp3(sp0);     // okay, template parameter F and argument shared_ptr<G>
shared_ptr<F> sp4(sp2);     // okay, template parameter F and argument shared_ptr<F>
shared_ptr<int> sp4(new G); // error, G* not convertible to int*
shared_ptr<int> sp5(sp2);   // error, template parameter int and argument shared_ptr<F>

shared_ptrكائن تملك مورد:

  • إذا أنه تم إنشاء باستخدام مؤشر إلى ذلك مورد

  • إذا تم إنشاء من shared_ptrكائن التي يملكها ذلك مورد،

  • إذا تم إنشاء من weak_ptr فئةكائن الذي يشير إلى هذا مورد، أو

  • إذا تم تعيين ملكية هذا مورد به، أما مع shared_ptr::عامل =أو بواسطة استدعاء دالة العضو shared_ptr::يعيد تعيين المعاملة.

shared_ptrالكائنات التي تملكها على يجعله مشتركًا مورد عنصر تحكم حظر. عنصر تحكم حظر الاحتجاز:

  • رقم shared_ptrالكائنات التي تملك مورد،

  • عدد weak_ptrالكائنات التي أشر إلى الموارد، من

  • deleter لهذا مورد في حالة وجود واحد،

  • المخصص مخصص عنصر تحكم حظر إذا لم يكن أحد.

shared_ptrكائن الذي تمت تهيئته باستخدام قيمة خالية مؤشر حظر تحكم وغير فارغ. بعد shared_ptrمورد بتحرير الكائن، لم تعد تملك هذا المورد. بعد weak_ptrمورد بتحرير الكائن، لم يعد يشير إلى ذلك المورد.

عند العدد shared_ptrالكائنات التي تملك مورد يصبح صفراً، المورد هو تحريرها، أما بحذفه أو بتمرير عنوانها deleter، استناداً إلى كيفية ملكية المورد تم أنشأ. عند العدد shared_ptrالكائنات التي تملك مورد هو صفر، والعدد من weak_ptrالكائنات أن الإشارة لهذا المورد هو صفر، عنصر تحكم يتم تحرير حظر، استخدام المخصص مخصص عنصر تحكم حظر إذا لم يكن واحد.

فارغ shared_ptrلا تملك أية موارد الكائن وليس له عنصر تحكم حظر.

deleter هو تعمل دالة كائن يحتوي على عضو operator(). به نوع يجب نسخ constructible، ويجب أن لا طرح الدالة الإنشائية نسخ و destructor به الاستثناءات. قبول معلمة واحدة، الكائن إلى يمكن حذفه.

الحصول على بعض وظائف وسيطة قائمة التي تعرف خصائص الناتج shared_ptr<Ty>أو weak_ptr<Ty>الكائن. يمكنك تحديد هذه بقائمة وسيطة بعدة طرق:

بدون وسائط – الناتج عن عملية الدمج كائن هو فارغ shared_ptrكائن أو فارغ weak_ptrكائن.

ptr– مؤشر نوعOther*إلى أن يكون مورد مدارة. Tyيجب أن يكون نوع كاملة. إذا فشلت دالة (لأن عنصر تحكم تعذر تخصيص حظر) فالتقييم يكون التعبير delete ptr.

ptr, dtor– مؤشر نوعOther*إلى مورد لإدارتها و deleter لهذا مورد. إذا فشلت دالة (لأن عنصر تحكم تعذر تخصيص حظر)، يقوم باستدعاء dtor(ptr)، الذي يجب أن يكون المعرف بشكل جيد.

ptr, dtor, alloc– مؤشر نوعOther*إلى مورد لإدارتها، deleter لهذا مورد، و مخصص مدارة تخزين أي يجب أن يتم تخصيصها و تحرير. إذا فشلت دالة (لأنه تعذر تخصيص حظر التحكم) يقوم باستدعاء dtor(ptr)، الذي يجب أن يكون المعرف بشكل جيد.

sp-- ashared_ptr<Other>الكائنات التي تملك مورد إلى إدارتها.

wp-- aweak_ptr<Other>كائن الذي يشير إلى مورد لإدارتها.

ap-- anauto_ptr<Other>كائن التي تحتوي على مؤشر إلى مورد لإدارتها. إذا دالة بنجاح استدعاء دالة ap.release()؛ وإلا يترك apدون تغيير.

في الجميع الحالات، المؤشر نوع Other*يجب أن تكون convertible إلى Ty*.

أمان مؤشر الترابط

يمكن قراءة مؤشرات الترابط المتعددة و الكتابة المختلفة shared_ptrالكائنات في نفس الوقت، حتى عندما تكون الكائنات النسخ التي تشترك الملكية.

المتطلبات

Header: <ذاكرة>

**مساحة الاسم:**std

راجع أيضًا:

المرجع

<ذاكرة> (TR1)

weak_ptr فئة

أعضاء البيانات أمان في مكتبة C++ القياسية