سؤال

أنا آخذ فئة برمجة C ++ الآن على برمجة نظم المعلومات الجغرافية. أنا حقا بدأت في الحصول على الكثير من الصداع من التعامل مع إدارة الذاكرة المناسبة. بالنظر في أي وقت غالبا ما يكون هناك 8-10 فصول يحمل كل مؤشر إلى مصفوفة ثلاثية الأبعاد أو أي شيء آخر كبير جدا. الآن رفعت صفنا بالفعل مسألة البروفيسور مما يسمح لنا باستخدام دفعة أو أتلست حزمة ميزة C ++ لعام 2008 (ل TR1). لقد رفض لكنه قال إذا أردنا العثور على إضافة بعض ملفات CPP / HPP من طرف ثالث. لقد حاولت بالفعل النظر في الحصول على Shared_Ptr خارج دفعة ولكن هذا أكثر من صداع من قيمته.

فهل هناك أي نوع من تنفيذ Shared_ptr المجاني هناك؟

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

المحلول

استخدام دفعة BCP. أداة. سوف يتيح لك استخراج وظائف معينة من مكتبات التعزيز.

bcp shared_ptr /boost_shared_ptr

سوف يستخرج Shared_ptr وتبعية لهذا الدليل.

نصائح أخرى

يعطى lokis. REF-عد مؤشر ذكي لقطة - بقدر ما أذكر أنه أقل اقتران ثم يعزز الرؤوس.

رأس التعزيز المعالج الذي يحتوي على تعريف shared_ptr. وبعد اكتبها إلى ملف .hpp واحد. بهذه الطريقة سوف تحصل على زيادة shared_ptr وجميع تبعياتها في ملف رأس واحد، دون الحاجة إلى التركيب الكامل للزيادة.

shared_ptr لا يحتاج إلى ارتباط أي مكتبة مشتركة برمزك، فهي مكتبة رائعة فقط ... لذلك يجب أن يعمل هذا.

بينما سيكون كريه فكرة حل الإنتاج، لن يكون من الصعب للغاية لفة خاصة بك لصف، إذا لم تحاول أن تكون كبرنامج متقاطع ومرن وخيط آمن ك Bost's:

template <typename contained>
class my_shared_ptr {
public:
   my_shared_ptr() : ptr_(NULL), ref_count_(NULL) { }

   my_shared_ptr(contained * p)
     : ptr_(p), ref_count_(p ? new int : NULL)
   { inc_ref(); }

   my_shared_ptr(const my_shared_ptr& rhs)
     : ptr_(rhs.p), ref_count_(rhs.ref_count_)
   { inc_ref(); }

   ~my_shared_ptr() {
     if(ref_count_ && 0 == dec_ref()) { delete ptr_; delete ref_count_; }
   }
   contained * get() { return ptr_; }
   const contained * get() const { return ptr_; }

   void swap(my_shared_ptr& rhs) // throw()
   {
      std::swap(p, rhs.p);
      std::swap(ref_count_, rhs.ref_count_);
   }

   my_shared_ptr& operator=(const my_shared_ptr& rhs) {
        my_shared_ptr tmp(rhs);
        this->swap(tmp);
        return *this;
   }

   // operator->, operator*, operator void*, use_count
private:
   void inc_ref() {
      if(ref_count_) { ++(*ref_count_); }
   }

   int  dec_ref() {
      return --(*ref_count_);
   }

   contained * ptr_;
   int * ref_count_;
};
#include <tr1/memory> // this is contained in STL.
std::tr1::shared_ptr<A> a = new A;

OW، فقط رأيت أستاذك لا يسمح لك باستخدام Tr1. سوء الحظ.

هل تحتاج حقا ملكية مشتركة كثيرا؟

يمكنك في كثير من الأحيان الحصول على فئة مخصصة مخصصة بسيطة، مع اتخاذ ملكية حصرية لكائن.

إدارة الذاكرة دون راي هي ألم، لكنك تحصل على راي دون shared_ptr.

لقد رصدت خطأ خطيرا في عينة التعليمات البرمجية. يجب أن يكون

ref_count_(p ? new int(0) : NULL)

بدلا من

ref_count_(p ? new int : NULL)

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

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